الأعراض
الاتصال بقاعدة بيانات Oracle باستخدام موفر Microsoft OLE DB ل Oracle (MSDAORA) ومن ثم إنهاء الاتصال على الملقم. عند فتح اتصال جديد لقاعدة بيانات Oracle من التطبيق الخاص بك، تتلقى رسالة خطأ استثناء ما يلي:
System.Data.OleDb.OleDbException: خطأ غير محدد
أورا-01012: لم يتم تسجيل دخولك
السبب
عندما تقوم بإنهاء الاتصال بقاعدة بيانات Oracle على جانب الملقم أثناء استخدام MSDAORA، يتم إرجاع قطع الاتصال إلى تجمع الاتصال. رمز تجمع الاتصال تتفاعل بشكل غير صحيح باستخدام الخاصية ريسيتكونيكشن من MSDAORA. عند هذه الخاصية غير معتمدة من قبل الموفر، يفسر رمز تجمع إعادة تعيين الاتصال وكلمة مرور صالحة من الاتصال بشكل غير صحيح. عند فتح التعليمات البرمجية للعميل اتصال جديد، يمكن استرداد قطع الاتصال التي تم إرجاعها إلى تجمع الاتصال. ولذلك، تظهر رسالة الخطأ المذكورة في قسم "الأعراض".
الحل
معلومات الإصلاح العاجل
الآن يتوفر إصلاح عاجل معتمد من Microsoft. ومع ذلك، الغرض منه هو حل المشكلة الموضحة في هذه المقالة فقط. تطبيقها فقط على الأنظمة التي تواجه هذه المشكلة بالتحديد. قد يتم إجراء اختبارات إضافية على هذا الإصلاح العاجل. ولذلك، إذا لم يكن تأثير المشكلة كبيرا، نوصي بالانتظار حتى الإصدار التالي من حزمة الخدمة الذي يحتوي على هذا الإصلاح العاجل.
لحل هذه المشكلة فورا، اتصل بخدمات دعم العملاء في Microsoft للحصول على الإصلاح العاجل. للحصول على قائمة كاملة من أرقام هواتف خدمات دعم العملاء في Microsoft وعلى معلومات حول تكاليف الدعم، الرجاء زيارة موقع Microsoft التالي على الويب:
http://support.microsoft.com/contactus/?ws=supportملاحظة: في بعض الحالات، قد يتم إلغاء المصروفات التي تحتسب عادة على مكالمات الدعم إذا قرر أخصائي الدعم لدى Microsoft أن تحديثًا معيناً سوف يعمل على حل المشكلة. سيتم اضافة تكاليف الدعم المعتادة على أسئلة الدعم الإضافية والمشاكل التي لا يأهل على حلها للتحديث المطلوب.
معلومات الملف
يحتوي إصدار اللغة الإنجليزية من هذا الإصلاح العاجل على سمات الملف (أو سمات الملف الأحدث) المسرودة في الجدول التالي. يتم سرد التواريخ والأوقات الخاصة بهذه الملفات بالتوقيت العالمي المتفق عليه (UTC). عند عرض معلومات الملف، يتم تحويلها إلى التوقيت المحلي. لمعرفة الفرق بين التوقيت العالمي المتفق عليه والتوقيت المحلي، استخدم علامة التبويب المنطقة الزمنية في أداة التاريخ والوقت في "لوحة التحكم".
Microsoft Data Access Components (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":
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، ومن ثم انقر فوق تطبيق وحدة التحكمضمن قوالب.
-
في المربع الاسم ، اكتب
اسم التطبيق، ثم انقر فوق موافق. بشكل افتراضي، يتم إنشاء ملف 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. في إطار وحدة التحكم، ترى الاستثناء المذكور في قسم "الأعراض".
المراجع
لمزيد من المعلومات حول موفر Microsoft OLE DB ل Oracle، قم بزيارة موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
http://msdn2.microsoft.com/en-us/library/ms810685.aspxللحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft":
824684 وصف للمصطلحات القياسية المستخدمة في وصف تحديثات برامج Microsoft
منتجات الجهات الأخرى المذكورة في هذه المقالة تابعة لشركات مستقلة عن Microsoft. لا تقدم Microsoft أي ضمان، سواء ضمنياً أو صريحا، بخصوص أداء هذه المنتجات أو كفائتها.