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 on

Cauza

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.8

839801 FIX: remedierile rapide sunt disponibile pentru MDAC 2.8MDAC 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

  1. Porniți Microsoft Visual Studio .NET.

  2. În meniul fișier , indicați spreNou, și apoi faceți clic pe proiect. Apare caseta de dialog New Project .

  3. Sub Tipuri de proiect, Proiecte Visual Basic, și apoi faceți clic pe Console Applicationsub șabloane.

  4. În caseta nume , tastațiAplicMea, ș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.

  5. Adăugaţi următorul cod în partea de sus:Cod Microsoft Visual Basic .NET

    Imports SystemImports System.Data.OleDb

    Visual C# .NET cod

    using System.Data.OleDb;
  6. Adăugaţi codul următor procedurii principale:Cod 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()

    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.

  7. În meniul de compilare , faceți clic pe Compilare soluții.

  8. În meniul de Depanare , faceți clic pePorniți. Veți vedea că o comandă se afișează în fereastra consolei.

  9. În Oracle SQL * Plus, executați comanda care se afișează în fereastra consolei.

  10. 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 MicrosoftProdusele 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.

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.

Comunitățile vă ajută să adresați întrebări și să răspundeți la întrebări, să oferiți feedback și să primiți feedback de la experți cu cunoștințe bogate.