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 FehlerORA-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:

http://support.microsoft.com/contactus/?ws=supportHinweis 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ügbarMDAC 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 aufNeu, 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 NameMyAppund 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 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 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 aufStarten. 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:

http://msdn2.microsoft.com/en-us/library/ms810685.aspxKlicken 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 SoftwareupdatesDie 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.

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.