PARANDUS: Saate tõrketeate "ORA-01012", kui loote ühenduse Oracle andmebaasi kasutades MSDAORA

Sümptomid

Oracle'i andmebaasiga saate ühenduse luua Microsoft OLE DB pakkuja Oracle’i jaoks (MSDAORA) abil ja seejärel katkestate ühenduse serveri poolel. Kui avate oma rakenduse kaudu Oracle'i andmebaasiga uue ühenduse, kuvatakse järgmine eranditõrge:

Märkus.

System.Data.OleDb.OleDbException: määramata tõrge
  ORA-01012: pole sisse logitud

Põhjus

Kui lõpetate MSDAORA kasutamise ajal oracle'i andmebaasi ühenduse serveripoolses servas, tagastatakse katkenud ühendus ühendusekausta. Ühendusekausta kood suhtleb valesti MSDAORA atribuudiga ResetConnection. Kui pakkuja seda atribuuti ei toeta, tõlgendab salvestuskood valesti, et ühendus lähtestatakse ja ühendus on kehtiv. Kui kliendikood avab uue ühenduse, võidakse tuua ühendusekausta tagastatud katkenud ühendus. Seetõttu kuvatakse tõrketeade, mida on mainitud jaotises "Sümptomid".

Lahendus

Kiirparanduse teave

Microsoftilt on nüüd saadaval toetatud kiirparandus. Siiski on see ette nähtud ainult selles artiklis kirjeldatud probleemi lahendamiseks. Rakendage see ainult süsteemidele, kus esineb see konkreetne probleem. See kiirparandus võib saada täiendavaid katseid. Seega, kui see probleem ei mõjuta teid tõsiselt, soovitame oodata järgmist hoolduspaketti, mis sisaldab seda kiirparandust.

Probleemi kohe lahendamiseks võtke kiirparanduse hankimiseks ühendust Microsofti klienditoe teenustega. Microsofti klienditoe teenuste telefoninumbrite täieliku loendi ja tugiteenuste kulude kohta teabe saamiseks külastage järgmist Microsofti veebisaiti:

http://support.microsoft.com/contactus/?ws=support Märkus. Erijuhtudel võidakse tavaliselt tugiteenuse kõnede eest tehtud tasud tühistada, kui Microsofti tugitöötaja leiab, et konkreetne värskendus lahendab teie probleemi. Tavapärased toetuskulud kehtivad täiendavatele tugiteenustega seotud küsimustele ja probleemidele, mis ei vasta kõnealuse värskenduse tingimustele.

Failiteave

Selle kiirparanduse ingliskeelne versioon sisaldab faili atribuute (või uuemad failiatribuudid), mis on loetletud järgmises tabelis. Nende failide kuupäevad ja kellaajad on loetletud koordineeritud maailmaaja (UTC) järgi. Failiteabe vaatamisel teisendatakse see kohalikuks kellaajaks. UTC ja kohaliku kellaaja erinevuse leidmiseks kasutage Juhtpaneel tööriista Kuupäev ja kellaaeg vahekaarti Ajavöönd.

Microsofti andmepääsukomponendid (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 Hoolduspakett 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 

See kiirparandus on saadaval osana kumulatiivne kiirparandus pakett. Kui saate selle kiirparanduse Microsofti toodete tugiteenuste, artikli number, mis on loetletud kiirparanduse paketi on 839801 MDAC 2.8 või 836799 MDAC 2.7 SP1. Lisateavet leiate Microsofti teabebaasi järgmisest artiklist:

MDAC 2.8

839801 PARANDUS: Kiirparandused on saadaval MDAC 2.8

MDAC 2.7 SP1

836799 PARANDUS: Kiirparandused on saadaval MDAC 2.7 hoolduspaketi Service Pack 1 jaoks

Olek

Microsoft on kinnitanud, et see on jaotises „Rakenduskoht“ loetletud Microsofti toodete korral esinev probleem.

Veel teavet

Toimingud käitumise taastekitamiseks

  1. Käivitage Microsoft Visual Studio .NET.

  2. Osutage menüüs Fail käsule
    Uus ja seejärel klõpsake nuppu Projitseeri. Kuvatakse dialoogiboks Uus projekt .

  3. Klõpsake jaotises Projektitüübid nuppu Visual Basicu projektid ja seejärel jaotises Mallid nuppu Konsoolirakendus.

  4. Tippige väljale Nimi
    MyApp ja seejärel klõpsake nuppu OK. Vaikimisi luuakse Module1.vb fail.

    Kui kasutate Microsoft Visual C# .NET-i, luuakse Class1.cs fail.

  5. Lisage ülaossa järgmine kood:

    Microsoft Visual Basicu .NET-kood

    Imports System
    Imports System.Data.OleDb
    

    Visual C# .NET-kood

    using System.Data.OleDb;
    
  6. Lisage põhitoimingussejärgmine kood:

    Visual Basicu .NET-kood

    Dim 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-kood

    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();
    
    

    Märkus. Muutke ühendusstring vastavalt oma keskkonnale.

  7. Klõpsake menüüs Koosta käsku Koosta lahendus.

  8. Klõpsake silumismenüüs nuppu
    Käivita. Näete, et konsooliaknas kuvatakse käsk.

  9. Käivitage rakenduses Oracle SQL*Plus konsooliaknas kuvatud käsk.

  10. Vajutage sisestusklahvi (ENTER). Konsooliaknas kuvatakse jaotises "Sümptomid" mainitud erand.

Viited

Microsoft OLE DB pakkuja Oracle’i jaoks kohta lisateabe saamiseks külastage järgmist Microsoft Developer Networki (MSDN) veebisaiti:

http://msdn2.microsoft.com/en-us/library/ms810685.aspx Lisateabe saamiseks klõpsake Microsofti teabebaasis oleva artikli kuvamiseks järgmist artiklinumbrit.

824684 Microsofti tarkvaravärskenduste kirjeldamiseks kasutatava standardterminite kirjeldus

 Selles artiklis nimetatud kolmandate osapoolte tooted on tootnud ettevõtted, mis ei ole Microsoftiga seotud. Microsoft ei anna nende toodete jõudluse ega töökindluse osas mitte mingigi kaudset ega muud garantiid.