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:
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ü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
-
Starten Sie Microsoft Visual Studio .NET.
-
Zeigen Sie im Menü Datei auf
Neu, und klicken Sie dann auf Projekt. Das Dialogfeld Neues Projekt angezeigt wird. -
Unter Projekttypenauf Visual Basic-Projekteund klicken Sie unter Vorlagenauf Konsolenanwendungsprojekt.
-
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. -
Fügen Sie den folgenden Code am Anfang:
Microsoft Visual Basic .NET codeImports System
Imports System.Data.OleDbVisual C# .NET code
using System.Data.OleDb;
-
Die Main-Prozedur den folgenden Code hinzufügen:
Visual Basic .NET codeDim 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 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.
-
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
-
Klicken Sie im Menü Debuggen auf
Starten. Sie sehen, dass ein Befehl im Konsolenfenster angezeigt wird. -
In Oracle SQL * Plus, führen Sie den Befehl, der im Konsolenfenster angezeigt wird.
-
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 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.