Update: Fehlermeldung "ORA-01012" Herstellen einer Oracle-Datenbank mit MSDAORA

Problembeschreibung

Verbinden mit einer Oracle-Datenbank mithilfe von Microsoft OLE DB Provider für Oracle (MSDAORA), und beenden Sie die Verbindung auf dem Server. Beim Öffnen einer neuen Verbindungs zur Oracle-Datenbank von der Anwendung wird folgende Ausnahmefehlermeldung erhalten:
System.Data.OleDb.OleDbException: Nicht spezifizierter Fehler
ORA-01012: nicht angemeldet

Ursache

Beim Beenden der Verbindungs zur Oracle-Datenbank auf dem Server mit MSDAORA wird die unterbrochene Verbindung an den Verbindungspool zurückgegeben. Connection pooling Code interagiert mit der ResetConnection -Eigenschaft der MSDAORA falsch. Wenn diese Eigenschaft vom Provider unterstützt wird, interpretiert pooling Code fälschlicherweise, dass die Verbindung zurückgesetzt wird und die Verbindung gültig ist. Wenn der Client-Code eine neue Verbindung geöffnet wird, kann die fehlerhafte Verbindung an den Verbindungspool zurückgegeben wurde abgerufen. Daher erhalten Sie die Fehlermeldung, die im Abschnitt "Symptome" genannt wird.

Problemlösung

Hotfix-Informationen

Ein unterstützter Hotfix ist inzwischen von Microsoft erhältlich. Es soll jedoch nur das Problem beheben, das in diesem Artikel beschrieben wird. Wenden Sie es nur auf Systeme an, bei denen dieses spezielle Problem auftritt. Dieser Hotfix wird möglicherweise noch getestet. Wenn Ihr System durch dieses Problem nicht schwerwiegend beeinträchtigt ist, empfehlen wir, auf das nächste Servicepack warten, das diesen Hotfix enthält.

Wenn dieses Problem sofort beheben möchten, wenden Sie sich an Microsoft Support Services, um den Hotfix zu erhalten. Eine vollständige Liste der Telefonnummern des Microsoft Product Support Services und Informationen zu den Supportkosten finden Sie auf der folgenden Microsoft-Website:Hinweis In bestimmten Fällen können Gebühren, die normalerweise für Support-Anrufe anfallen abgebrochen werden, wenn ein Microsoft-Supportmitarbeiter feststellt, dass ein bestimmtes Update Ihr Problem behebt. Die normalen Supportkosten gilt für zusätzliche Supportfragen und Probleme, die nicht für das betreffende Update qualifizieren.

Dateiinformationen

Die englische Version dieses Hotfixes weist Dateiattribute (oder spätere Attribute), die in der folgenden Tabelle aufgelistet sind. Die Datums- und Uhrzeitangaben für diese Dateien sind in Coordinated Universal Time (UTC) aufgelistet. Wenn Sie die Dateiinformationen anzeigen, werden sie in die lokale Zeit konvertiert. Den Unterschied zwischen UTC- und Ortszeit können Sie in der Systemsteuerung auf der Registerkarte Zeitzone unter "Datum und Uhrzeit" ermitteln.
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
Dieser Hotfix steht als Teil des kumulativen Hotfix-Paket. Wenn Sie diesen Hotfix von Microsoft Product Support Services erhalten, werden die Artikelnummer, die im Hotfix-Paket aufgeführt 839801 für MDAC 2.8 oder 836799 für MDAC 2.7 SP1. Weitere Informationen finden Sie im folgenden Artikel in der Microsoft Knowledge Base:



MDAC 2.8
839801 Update: Hotfixes sind für MDAC 2.8 verfügbar

MDAC 2.7 SP1
836799 Update: Hotfixes sind für MDAC 2.7 Service Pack 1

Status

Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Starten Sie Microsoft Visual Studio .NET.
  2. Zeigen Sie im Menü Datei auf
    Neu, und klicken Sie dann auf Projekt. Das Dialogfeld Neues Projekt angezeigt wird.
  3. Unter Projekttypenauf Visual Basic-Projekteund klicken Sie unter Vorlagenauf Konsolenanwendungsprojekt.
  4. Geben Sie im Feld Name
    MyAppund klicken Sie dann auf OK. Die Datei Module1.vb wird standardmäßig erstellt.

    Wenn Sie Microsoft Visual C# .NET verwenden, wird die Datei Class1.cs erstellt.
  5. Fügen Sie den folgenden Code am Anfang:

    Microsoft Visual Basic .NET code
    Imports SystemImports System.Data.OleDb
    Visual C# .NET code
    using System.Data.OleDb;
  6. Die Main-Prozedur den folgenden Code hinzufügen:

    Visual Basic .NET code
    Dim cn As OleDbConnectionDim 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 code
    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();

    Hinweis Ändern Sie die Verbindungszeichenfolge entsprechend Ihrer Umgebung.
  7. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
  8. Klicken Sie im Menü Debuggen auf
    Starten. Sie sehen, dass ein Befehl im Konsolenfenster angezeigt wird.
  9. In Oracle SQL * Plus, führen Sie den Befehl, der im Konsolenfenster angezeigt wird.
  10. Drücken Sie die EINGABETASTE. Im Konsolenfenster die im Abschnitt "Symptome" erwähnte Ausnahme angezeigt.

Referenzen

Weitere Informationen zu Microsoft OLE DB Provider für Oracle finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:Klicken Sie für Weitere Informationen auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:
824684 Erläuterung von der standardmäßigen Standardbegriffen bei Microsoft Softwareupdates

Die in diesem Artikel erörterten Produkte von Drittanbietern werden von Unternehmen hergestellt, die von Microsoft unabhängig sind. Microsoft gewährt keine implizite oder sonstige Garantie in die Leistung oder Zuverlässigkeit dieser Produkte.
Eigenschaften

Artikelnummer: 834905 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Feedback