KORRIGERA: Felmeddelandet ”ORA-01012” visas när du ansluter till en Oracle-databas med hjälp av MSDAORA


Symptom


Du kan ansluta till en Oracle-databas med hjälp av Microsoft OLE DB Provider för Oracle (MSDAORA) och sedan avslutar du anslutningen på serversidan. När du öppnar en ny anslutning till Oracle-databasen i programmet visas följande felmeddelande för undantag:
System.Data.OleDb.OleDbException: Okänt fel
ORA-01012: inte inloggad

Orsak


När du avslutar anslutningen till Oracle-databasen på serversidan när du använder MSDAORA returneras avbrutna anslutningar till anslutningspoolen. Anslutning anslutningspoolen koden felaktigt samverkar med egenskapen ResetConnection för MSDAORA. När den här egenskapen inte stöds av providern, tolkar anslutningspoolen koden felaktigt att anslutningen återställs och att anslutningen är giltig. När klienten öppnas en ny anslutning kan bryts anslutningen som returnerades till anslutningspoolen hämtas. Därför visas felmeddelandet som nämns i avsnittet ”Symptom”.

Lösning


Information om snabbkorrigeringen

En snabbkorrigering är nu tillgänglig från Microsoft. Den är emellertid avsedd att åtgärda det problem som beskrivs i denna artikel. Använd den bara på datorer där detta problem uppstår. Snabbkorrigeringen kan komma att testas igen. Om inte störs alltför mycket av detta problem rekommenderar vi att du väntar på Nästa service pack som innehåller den här snabbkorrigeringen.

Om du vill lösa problemet omedelbart kontaktar du Microsoft support för att få snabbkorrigeringen. En fullständig lista över telefonnummer till Microsoft Customer Support Services och information om supportkostnader finns på följande Microsoft-webbplats:Obs! I särskilda fall avbryts de avgifter som är normala för supportsamtal om en supporttekniker anser att en särskild uppdatering kan lösa ditt problem. De vanliga supportkostnaderna gäller för övriga supportfrågor och problem som inte berör den särskilda uppdateringen.

Filinformation

Den engelska versionen av den här snabbkorrigeringen har de filattribut (eller senare filattribut) som visas i följande tabell. Datum och tider för dessa filer anges i UTC-tid (UTC). När du visar filinformationen konverteras den till lokal tid. Använd fliken tidszon i verktyget datum och tid på Kontrollpanelen om du vill se skillnaden mellan UTC-tid och lokal tid.
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 servicepack 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
Den här snabbkorrigeringen är tillgänglig som en del av en kumulativ snabbkorrigering. När du får den här snabbkorrigeringen från Microsoft Product Support Services är artikelnumret som anges i paketet 839801 för MDAC 2.8 eller 836799 för MDAC 2.7 SP1. Mer information finns i följande artikel i Microsoft Knowledge Base:



MDAC 2.8
839801 KORRIGERA: det finns snabbkorrigeringar för MDAC 2.8

MDAC 2.7 SP1
836799 KORRIGERA: det finns snabbkorrigeringar för MDAC 2.7 Service Pack 1

Status


Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet ”gäller”.

Mer Information


Åtgärder för att återskapa problemet

  1. Starta Microsoft Visual Studio .NET.
  2. Arkiv -menyn, peka på
    Nyoch sedan på projekt. Dialogrutan Nytt projekt visas.
  3. Klicka på Konsolprogramunder mallarunder Projekttyper Visual Basic-projekt.
  4. I rutan namn skriver du:
    MyAppoch klicka sedan på OK. Som standard skapas filen Module1.vb.

    Om du använder Microsoft Visual C# .NET, skapas filen Class1.cs.
  5. Lägg till följande kod överst:

    Kod för Microsoft Visual Basic .NET
    Imports System
    Imports System.Data.OleDb
    Visual C# .NET-kod
    using System.Data.OleDb;
  6. Lägg till följande kod i Main-proceduren:

    Kod i Visual Basic .NET
    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-kod
    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! Ändra anslutningssträngen efter din miljö.
  7. Klicka på Skapa lösningBuild -menyn.
  8. Klicka på Felsök -menyn
    Starta. Du ser att ett kommando visas i konsolfönstret.
  9. I Oracle SQL * Plus, kör du kommandot som visas i konsolfönstret.
  10. Tryck på RETUR. I konsolträdet visas de undantag som nämns i avsnittet ”Symptom”.

Referenser


Mer information om Microsoft OLE DB Provider för Oracle finns på följande Microsoft Developer Network (MSDN)-webbplats:För ytterligare information klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:
824684 beskrivning av standardterminologin som används för att beskriva Microsoft-programuppdateringar

Tredjepartsprodukter som diskuteras i denna artikel tillverkas oberoende av Microsoft. Microsoft lämnar inga garantier, implicerade eller andra, vad gäller prestanda eller tillförlitlighet hos dessa produkter.