מאפייני הבעיה
התחברות למסד נתונים של Oracle באמצעות ספק ה-Microsoft OLE DB עבור Oracle (MSDAORA), ולאחר מכן תסיים את החיבור בצד השרת. בעת פתיחת חיבור חדש למסד הנתונים של Oracle מהיישום שלך, תקבל את הודעת השגיאה הבאה של החריג:
System.Data.OleDb.OleDbException: שגיאה לא מוגדרת
ORA-01012: לא מחובר
הגורם
כאשר תסיים את החיבור למסד הנתונים של Oracle בצד השרת בעת שימוש ב- MSDAORA, חיבור שהתנתק יוחזר אל מאגר החיבורים. הקוד שינוים חיבור אינטראקציה באופן שגוי עם המאפיין ResetConnection של MSDAORA. כאשר מאפיין זה אינו נתמך על-ידי הספק, הקוד שינוים מפרש באופן שגוי החיבור מאופס ולאחר החיבור אינו חוקי. כאשר קוד לקוח פותח חיבור חדש, ניתן לאחזר את החיבור שהתנתק שהחזירו מאגר החיבורים. לפיכך, מתקבלת הודעת השגיאה המוזכרת בסעיף "מאפייני הבעיה".
פתרון
מידע על תיקונים חמים
תיקון חם נתמך זמין כעת מ- Microsoft. עם זאת, הוא מיועד רק את הבעיה המתוארת במאמר זה. יש להחיל אותו רק במערכות שהתעוררה בהן בעיה ספציפית זו. תיקון חם זה עשוי לעבור בדיקות נוספות. לכן, אם המערכת שברשותך לא נפגעה באופן חמור מבעיה זו, מומלץ להמתין למהדורת ה-service pack הבא המכיל תיקון חם זה.
כדי לפתור בעיה זו באופן מיידי, פנה לשירותי התמיכה בלקוחות של Microsoft לקבלת התיקון החם. לקבלת רשימה מלאה של מספרי הטלפון בשירותי התמיכה ללקוח של Microsoft ומידע על עלויות תמיכה, בקר באתר האינטרנט הבא של Microsoft:
http://support.microsoft.com/contactus/?ws=supportהערה במקרים מיוחדים, ניתן לבטל את החיובים שהצגת שיחות תמיכה אם מומחה תמיכה של Microsoft יקבע שעדכון ספציפי יפתור את הבעיה. דמי התמיכה המקובלים יחולו על נוספים שאלות וסוגיות תמיכה אשר אינן מצריכות העדכון הספציפי האמור.
פרטי קובץ
הגירסה האנגלית של תיקון חם זה כוללת את תכונות הקובץ (או תכונות קובץ מתקדמות יותר) המפורטות בטבלה הבאה. התאריכים והשעות המתייחסים לקבצים הללו רשומים לפי זמן אוניברסלי מתואם (UTC). כשמציגים את פרטי הקובץ, היא מומרת לזמן המקומי. כדי לברר את הפרש השעות בין זמן UTC לזמן המקומי, השתמש בכרטיסייה אזור זמן בכלי תאריך ושעה בלוח הבקרה.
רכיבי Access לנתונים של Microsoft (MDAC) 2.8
Date Time Version Size File name
---------------------------------------------------------
10-Mar-2004 04:22 2.80.1036.0 225,280 Msdaora.dll
10-Mar-2004 04:22 2000.85.1036.0 24,576 Odbcbcp.dll
10-Mar-2004 04:21 2.80.1036.0 442,368 Oledb32.dll
10-Mar-2004 04:21 2000.85.1036.0 401,408 Sqlsrv32.dll
MDAC 2.7 ה-Service Pack 1
Date Time Version Size File name
---------------------------------------------------------
10-Mar-2004 02:19 2000.81.9046.0 61,440 Dbnetlib.dll
10-Mar-2004 02:20 2.71.9046.0 221,184 Msdaora.dll
10-Mar-2004 02:15 2.71.9046.0 126,976 Msdart.dll
10-Mar-2004 02:15 3.520.9046.0 204,800 Odbc32.dll
10-Mar-2004 02:20 2000.81.9046.0 24,576 Odbcbcp.dll
10-Mar-2004 02:20 3.520.9046.0 98,304 Odbccp32.dll
10-Mar-2004 02:16 2.71.9046.0 417,792 Oledb32.dll
10-Mar-2004 02:19 2000.81.9046.0 471,040 Sqloledb.dll
10-Mar-2004 02:19 2000.81.9046.0 385,024 Sqlsrv32.dll
תיקון חם זה זמין כחלק חבילת התיקונים החמים המצטברים. כאשר תקבל את התיקון החם מתוך שירותי התמיכה במוצר של Microsoft, מספר מאמר מפורט בחבילת התיקון החם יהיה 839801 עבור MDAC 2.8 או 836799 עבור MDAC 2.7 SP1. לקבלת מידע נוסף, עיין במאמר הבא מתוך מאגר הידע Microsoft Knowledge Base:
MDAC 2.8
תיקון 839801 : תיקונים חמים זמינים עבור MDAC 2.8
MDAC 2.7 SP1
תיקון 836799 : תיקונים חמים זמינים עבור MDAC 2.7 Service Pack 1
מצב
Microsoft אישרה כי מדובר בבעיה במוצרי Microsoft הרשומים במקטע 'חל על'.
מידע נוסף
שלבים לשחזור ההתנהגות
-
הפעל את Microsoft Visual Studio .NET.
-
בתפריט קובץ , הצבע על
חדש, ולאחר מכן לחץ על הפרוייקט. מופיעה תיבת הדו-שיח פרוייקט חדש . -
תחת סוגי פרוייקטים, לחץ על פרוייקטים Visual Basicולאחר מכן לחץ על יישום מסוףתחת תבניות.
-
בתיבה שם , הקלד
MyApp, ולאחר מכן לחץ על אישור. כברירת מחדל, הקובץ Module1.vb נוצר.
אם אתה משתמש ב- Microsoft Visual C# .NET, יצירת קובץ ה-Class1.cs. -
הוסף את הקוד הבא בראש:
קוד Microsoft Visual Basic .NETImports System
Imports System.Data.OleDbקוד visual C# .NET
using System.Data.OleDb;
-
הוסף את הקוד הבא לשגרת ראשי:
קוד Visual Basic .NETDim cn As OleDbConnection
Dim cmd As OleDbCommand
Dim r As OleDbDataReader
Dim sid As String
Dim orlcmd As String
Dim connString As String = "Provider=MSDAORA;DataSource=<data source>;User ID=<user name>;Password=<password>;"
Try
'Create a new connection to the Oracle database by using MSDAORA.
cn = New OleDbConnection
cn.ConnectionString = connString
cn.Open()
cmd = New OleDbCommand
cmd.CommandText = "SELECT SID , SERIAL# FROM V$SESSION WHERE SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM=1)"
cmd.Connection = cn
r = cmd.ExecuteReader()
sid = ""
If (r.Read()) Then
sid = r.GetValue(0).ToString() + "," + r.GetValue(1).ToString()
End If
orlcmd = "Alter System Kill Session '" + sid + "' Immediate;"
Console.WriteLine("Open the SQL Plus window, run the following command, and then press ENTER:")
Console.WriteLine(orlcmd)
Console.ReadLine()
r.Close()
cmd.CommandText = "SELECT count(*) from TAB"
Try
'Expecting this command to fail because connection has been killed
r = cmd.ExecuteReader()
Catch orlex As OleDbException
Console.WriteLine(orlex.Message)
cmd.Dispose()
'Close the bad connection.
cn.Close()
System.Threading.Thread.Sleep(1000)
cn.ConnectionString = connString
cn.Open()
cmd = New OleDbCommand
cmd.CommandText = "SELECT count(*) FROM TAB"
cmd.Connection = cn
'This command will fail, but it will work when a new connection is used.
r = cmd.ExecuteReader()
If (r.Read()) Then
Console.WriteLine(r.GetValue(0))
End If
End Try
Catch ex As OleDbException
Console.WriteLine(ex.ToString())
End Try
Console.WriteLine("Press ENTER to exit...")
Console.ReadLine()קוד visual C# .NET
OleDbConnection cn;
OleDbCommand cmd;
OleDbDataReader r;
String sid;
String orlcmd;
String connString="Provider=MSDAORA;DataSource=<data source>;User ID=<user name>;Password=<password>;";
try
{
//Create a connection to the Oracle database by using MSDAORA.
cn= new OleDbConnection();
cn.ConnectionString=connString;
cn.Open();
cmd=new OleDbCommand();
cmd.CommandText="SELECT SID , SERIAL# FROM V$SESSION WHERE SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM=1)";
cmd.Connection=cn;
r=cmd.ExecuteReader();
sid="";
if(r.Read())
{
sid=r.GetValue(0).ToString()+","+r.GetValue(1).ToString();
}
orlcmd="Alter System Kill Session '"+sid+"' Immediate;";
Console.WriteLine("Open the SQL Plus window, run the following command, and then press ENTER:");
Console.WriteLine(orlcmd);
Console.ReadLine();
r.Close();
cmd.CommandText="SELECT count(*) from TAB";
try
{
//Expecting this to fail because the connection is killed.
r=cmd.ExecuteReader();
}
catch(OleDbException orlex)
{
Console.WriteLine(orlex.Message);
cmd.Dispose();
//Close the bad connection.
cn.Close();
System.Threading.Thread.Sleep(1000);
cn.ConnectionString=connString;
cn.Open();
cmd=new OleDbCommand();
cmd.CommandText="SELECT count(*) FROM TAB";
cmd.Connection=cn;
//This command will fail, but it will work when a new connection is used.
r=cmd.ExecuteReader();
if(r.Read())
{
Console.WriteLine(r.GetValue(0).ToString());
}
}
}
catch(OleDbException ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();הערה שנה את מחרוזת החיבור בהתאם לסביבה שלך.
-
בניית התפריט, לחץ על בניית פתרון.
-
בתפריט ' איתור באגים ', לחץ
התחל. אתה רואה פקודה מוצג בחלון המסוף. -
ב- Oracle SQL * בנוסף, הפעל את הפקודה המוצגת בחלון המסוף.
-
הקש ENTER. בחלון המסוף, תראה את החריג המוזכרת בסעיף "מאפייני הבעיה".
הפניות
לקבלת מידע נוסף אודות ספק OLE DB של Microsoft עבור Oracle, בקר באתר האינטרנט הבא של Microsoft מפתח רשת (MSDN):
http://msdn2.microsoft.com/en-us/library/ms810685.aspxלקבלת מידע נוסף, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:
824684 תיאור המינוח הרגיל המשמש לתיאור עדכוני התוכנה של מיקרוסופט
מוצרי ספקים חיצוניים הנזכרים במאמר זה מיוצרים על ידי חברות שאינן תלויות ב-Microsoft. חברת Microsoft אינה מעניקה אחריות, בין במפורש ובין במשתמע, לגבי הביצועים או האמינות של מוצרים אלה.