LØSNING: Du får feilmeldingen «ORA-01012» når du kobler til en Oracle-database ved hjelp av MSDAORA

Symptomer

Du kobler deg til en Oracle-database ved hjelp av Microsoft OLE DB-leverandør for Oracle (MSDAORA), og deretter avslutter du tilkoblingen på serversiden. Når du åpner en ny tilkobling til Oracle-databasen fra programmet, får du følgende unntaksfeilmelding:

Obs!

System.Data.OleDb.OleDbException: Uspesifisert feil
  ORA-01012: ikke logget på

Årsak

Når du avslutter tilkoblingen til Oracle-databasen på serversiden mens du bruker MSDAORA, returneres den brutte tilkoblingen til tilkoblingsutvalget. Tilkoblingsgruppekoden samhandler feilaktig med ResetConnection-egenskapen for MSDAORA. Når denne egenskapen ikke støttes av leverandøren, tolker utvalget feilaktig at tilkoblingen er tilbakestilt, og at tilkoblingen er gyldig. Når klientkoden åpner en ny tilkobling, kan den brutte tilkoblingen som ble returnert til tilkoblingsutvalget, bli hentet. Derfor får du feilmeldingen som er nevnt i delen «Symptomer».

Oppløsning

Informasjon om hurtigreparasjoner

En støttet hurtigreparasjon er nå tilgjengelig fra Microsoft. Den er imidlertid bare ment å løse problemet som beskrives i denne artikkelen. Bruk det bare på systemer som har dette bestemte problemet. Denne hurtigreparasjonen kan underkastes ytterligere testing. Derfor anbefaler vi at du venter på neste oppdateringspakke som inneholder denne hurtigreparasjonen, hvis du ikke opplever dette problemet.

Hvis du vil løse dette problemet umiddelbart, kontakter du Microsoft Kundestøtte for å få hurtigreparasjonen. Du finner en fullstendig liste over telefonnumre til Microsoft kundestøtte og informasjon om støttekostnader på følgende Microsoft-webområde:

http://support.microsoft.com/contactus/?ws=support I spesielle tilfeller kan kostnader som vanligvis påløper for kundestøttesamtaler, bli avbrutt hvis en Microsoft Kundestøtte-representant finner ut at en bestemt oppdatering vil løse problemet. De vanlige støttekostnadene gjelder for flere kundestøttespørsmål og problemer som ikke kvalifiserer for den aktuelle oppdateringen.

Filinformasjon

Den engelske versjonen av denne hurtigreparasjonen har filattributtene (eller nyere filattributter) som er oppført i tabellen nedenfor. Datoene og klokkeslettene for disse filene er oppført i Coordinated Universal Time (UTC). Når du viser filinformasjonen, konverteres den til lokal tid. Hvis du vil finne forskjellen mellom UTC og lokal tid, bruker du Tidssone-fanen i verktøyet for dato og klokkeslett i Kontrollpanel.

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 

Denne hurtigreparasjonen er tilgjengelig som en del av en kumulativ hurtigreparasjonspakke. Når du mottar denne hurtigreparasjonen fra Microsoft Kundestøtte, blir artikkelnummeret som er oppført i hurtigreparasjonspakken, 839801 for MDAC 2.8 eller 836799 for MDAC 2.7 SP1. Du finner mer informasjon i følgende artikkel i Microsoft Knowledge Base:

MDAC 2.8

839801 LØSNING: Hurtigreparasjoner er tilgjengelige for MDAC 2.8

MDAC 2.7 SP1

836799 LØSNING: Hurtigreparasjoner er tilgjengelige for MDAC 2.7 Service Pack 1

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen «Gjelder for».

Mer informasjon

Trinn for å reprodusere virkemåten

  1. Start Microsoft Visual Studio .NET.

  2. Pek på
    Ny, og klikk deretter Prosjekt. Dialogboksen Nytt prosjekt vises.

  3. Klikk Visual Basic-prosjekter under Prosjekttyper, og klikk deretter Konsollprogramunder Maler.

  4. I Navn-boksen skriver du inn
    MyApp, og klikk deretter OK. Den Module1.vb filen opprettes som standard.

    Hvis du bruker Microsoft Visual C# .NET, opprettes den Class1.cs filen.

  5. Legg til følgende kode øverst:

    Microsoft Visual Basic .NET-kode

    Imports System
    Imports System.Data.OleDb
    

    Visual C# .NET-kode

    using System.Data.OleDb;
    
  6. Legg til følgende kode i hovedprosedyren:

    Visual Basic .NET-kode

    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-kode

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

    Obs! Endre tilkoblingsstrengen i henhold til miljøet.

  7. Klikk Byggløsning på Build-menyen.

  8. På Feilsøking-menyen klikker du
    Start. Du ser at en kommando vises i konsollvinduet.

  9. I Oracle SQL*Plus kjører du kommandoen som vises i konsollvinduet.

  10. Trykk ENTER. I konsollvinduet ser du unntaket som er nevnt i «Symptomer»-delen.

Kilder

Hvis du vil ha mer informasjon om Microsoft OLE DB-leverandør for Oracle, kan du gå til følgende nettsted for Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms810685.aspx Hvis du vil ha mer informasjon, kan du lese følgende artikkel i Microsoft Knowledge Base:

824684 Beskrivelse av standardterminologien som brukes til å beskrive Microsoft-programvareoppdateringer

 Tredjepartsproduktene som beskrives i denne artikkelen, er utviklet av firmaer som er uavhengige av Microsoft. Microsoft gir ingen garantier, indirekte eller på andre måter, når det gjelder ytelsen eller påliteligheten til disse produktene.