อาการ
คุณเชื่อมต่อกับฐานข้อมูล 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 Support Professional ตัดสินว่าโปรแกรมปรับปรุงที่เฉพาะเจาะจงจะแก้ไขปัญหาของคุณได้ ค่าใช้จ่ายในการสนับสนุนตามปกติจะใช้กับคำถามและปัญหาในการสนับสนุนเพิ่มเติมซึ่งไม่สอดคล้องตามเกณฑ์สำหรับโปรแกรมปรับปรุงเฉพาะที่เกี่ยวข้อง
ข้อมูลแฟ้ม
เวอร์ชันภาษาอังกฤษของโปรแกรมแก้ไขด่วนนี้มีแอตทริบิวต์ของแฟ้ม (หรือแอตทริบิวต์ของแฟ้มที่ใหม่กว่านี้) ซึ่งแสดงรายการไว้ในตารางต่อไปนี้ วันที่และเวลาสำหรับแฟ้มเหล่านี้จะแสดงรายการไว้ในรูปแบบเวลามาตรฐานสากล (UTC) เมื่อคุณดูข้อมูลแฟ้ม ระบบจะแปลงข้อมูลนี้เป็นเวลาท้องถิ่น เมื่อต้องการค้นหาความแตกต่างระหว่างเวลา UTC กับเวลาท้องถิ่น ใช้แท็บโซนเวลาในเครื่องมือ'วันและเวลา'ใน'แผงควบคุม'
คอมโพเนนต์การเข้าถึงข้อมูลของ 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
Service Pack 2.7 MDAC 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แก้ไข: โปรแกรมแก้ไขด่วนพร้อมใช้งานสำหรับ 1 ของ Service Pack 2.7 MDAC
สถานะ
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รหัสแสดงผลของ 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()รหัสแสดงผลของ 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 Developer Network (MSDN) ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/ms810685.aspxสำหรับข้อมูลเพิ่มเติม คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
824684คำอธิบายของคำศัพท์มาตรฐานที่ใช้เพื่ออธิบายปรับปรุงซอฟต์แวร์ของ Microsoft
ผลิตภัณฑ์ของบริษัทอื่นที่กล่าวถึงในบทความนี้ผลิตขึ้น โดยบริษัทที่ไม่ขึ้นอยู่กับ Microsoft ไมโครซอฟท์ไม่รับประกัน ทั้งโดยนัย หรืออย่างอื่น ใด เกี่ยวกับประสิทธิภาพหรือความน่าเชื่อถือของผลิตภัณฑ์เหล่านี้