Simptome
Vă conectați la o bază de date Oracle utilizând Microsoft OLE DB Provider pentru Oracle (MSDAORA) și apoi se închide conexiunea pe partea serverului. Când deschideți o nouă conexiune la baza de date Oracle din aplicația dvs., primiți următorul mesaj de eroare de excepție:
System.Data.OleDb.OleDbException: Eroare nespecificată
ORA-01012: nu log onCauza
Când închideți conexiunea la baza de date Oracle pe partea serverului în timpul utilizării MSDAORA, întrerupe conexiunea este returnat în rezervorul de conexiune. Codul de prevenire conexiune incorect interacționează cu proprietatea ResetConnection MSDAORA. Atunci când această proprietate nu este acceptat de către furnizorul, codul de prevenire interpretează incorect că conexiunea este resetat și că conexiunea este validă. Atunci când codul de client se deschide o conexiune nouă, întrerupe conexiunea care s-a revenit la rezervorul de conexiune pot fi regăsite. De aceea, primiți mesajul de eroare menționat în secțiunea "simptome".
Rezolvare
Informații despre remedierea rapidă
Un hotfix acceptat este acum disponibil de la Microsoft. Cu toate acestea, aceasta este scopul de a corecta numai problema descrisă în acest articol. Aplicați-o numai pe sistemele care întâmpină această problemă anume. Această remediere rapidă poate să necesite testare suplimentară. De aceea, dacă nu sunteți grav afectat de această problemă, vă recomandăm să așteptați următorul pachet service pack care conține această remediere rapidă.
Pentru a rezolva imediat problema, contactaţi serviciile de asistență pentru clienți Microsoft pentru a obține remedierea rapidă. Pentru o listă completă a numerelor de telefon ale serviciilor de asistență pentru clienți Microsoft și informații despre costurile de asistență, vizitați următorul site Web Microsoft:http://support.microsoft.com/contactus/?ws=supportNotă În cazuri speciale, costurile implicate de obicei pentru apelurile de suport pot fi anulate dacă un specialist în asistență Microsoft stabilește că o anumită actualizare va rezolva problema. Se vor aplica costurile uzuale de asistenţă pentru întrebări suplimentare de asistenţă şi pentru probleme ce nu fac obiectul actualizării în cauză.
Informații despre fișier
Versiunea în limba engleză a acestei remedieri rapide are atributele de fişier (sau atribute de fişier mai recente) enumerate în următorul tabel. Datele şi orele acestor fişiere sunt exprimate în listă în ora universală (UTC). Când vizualizaţi informaţiile despre fișier, acesta este convertit la ora locală. Pentru a afla diferența între timpul universal și cel local, utilizați fila fusul orar din instrumentul dată și oră din panoul de Control.
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
Această remediere rapidă este disponibilă ca parte a unui pachet de remediere rapidă cumulativă. Atunci când această remediere rapidă de la serviciile de asistență pentru produse Microsoft, numărul de articol care este listat în pachetul de remediere rapidă va fi 839801 pentru MDAC 2.8 sau 836799 pentru MDAC 2.7 SP1. Pentru mai multe informații, consultați următorul articol din baza de cunoștințe Microsoft:
MDAC 2.8839801 FIX: remedierile rapide sunt disponibile pentru MDAC 2.8 MDAC 2.7 SP1
836799 FIX: remedierile rapide sunt disponibile pentru MDAC 2.7 Service Pack 1
Stare
Microsoft a confirmat că aceasta este o problemă cu produsele Microsoft enumerate în secţiunea „Se aplică la".
Mai multe informații
Pași pentru a reproduce comportamentul
-
Porniți Microsoft Visual Studio .NET.
-
În meniul fișier , indicați spre
Nou, și apoi faceți clic pe proiect. Apare caseta de dialog New Project . -
Sub Tipuri de proiect, Proiecte Visual Basic, și apoi faceți clic pe Console Applicationsub șabloane.
-
În caseta nume , tastați
AplicMea, și apoi faceți clic pe OK. În mod implicit, se creează fișierul Module1.vb. Dacă utilizați Microsoft Visual C# .NET, este creat fișierul Class1.cs. -
Adăugaţi următorul cod în partea de sus:
Cod Microsoft Visual Basic .NETImports System
Imports System.Data.OleDbVisual C# .NET cod
using System.Data.OleDb;
-
Adăugaţi codul următor procedurii principale:
Cod 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 cod
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();Notă Modificați șirul de conexiune în funcţie de mediul dvs.
-
În meniul de compilare , faceți clic pe Compilare soluții.
-
În meniul de Depanare , faceți clic pe
Porniți. Veți vedea că o comandă se afișează în fereastra consolei. -
În Oracle SQL * Plus, executați comanda care se afișează în fereastra consolei.
-
Apăsaţi pe ENTER. În fereastra de consolă, vedeți excepție menționat în secțiunea "simptome".
Referințe
Pentru mai multe informații despre Microsoft OLE DB Provider pentru Oracle, vizitați următorul site Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms810685.aspxPentru informații suplimentare, faceți clic pe următorul număr de articol pentru a vedea articolul în baza de cunoștințe Microsoft:
824684 Descrierea terminologiei standard care este utilizat pentru a descrie actualizările de software Microsoft Produsele terţe despre care se discută în acest articol sunt fabricate de companii independente de Microsoft. Microsoft nu garantează în niciun fel, implicit sau în alt mod, funcţionarea sau fiabilitatea acestor produse.