อาการ
คุณเชื่อมต่อกับฐานข้อมูล 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.8MDAC 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 .NET
Imports SystemImports System.Data.OleDb
รหัสแสดงผลของ C# .NET
using System.Data.OleDb;
-
เพิ่มรหัสต่อไปนี้ให้กับกระบวนงานหลัก:รหัส Visual Basic .NET
Dim cn As OleDbConnectionDim cmd As OleDbCommandDim r As OleDbDataReaderDim sid As StringDim orlcmd As StringDim 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 TryCatch ex As OleDbException Console.WriteLine(ex.ToString())End TryConsole.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 ไมโครซอฟท์ไม่รับประกัน ทั้งโดยนัย หรืออย่างอื่น ใด เกี่ยวกับประสิทธิภาพหรือความน่าเชื่อถือของผลิตภัณฑ์เหล่านี้