Symptomen
U verbinding maken met een Oracle-database met behulp van de Microsoft OLE DB-Provider voor Oracle (MSDAORA) en vervolgens het beëindigen van de verbinding op de server. Wanneer u een nieuwe verbinding met de Oracle-database vanuit de toepassing opent, wordt het volgende foutbericht van uitzondering:
System.Data.OleDb.OleDbException: Onbekende foutORA-01012: niet aangemeld
Oorzaak
Wanneer u de verbinding met de Oracle-database op de server tijdens het gebruik van MSDAORA beëindigt, wordt de verbinding verbroken wordt teruggestuurd naar de verbindingsgroep. De bijbehorende code verbinding communiceert niet goed met de eigenschap ResetConnection van MSDAORA. Wanneer deze eigenschap wordt niet ondersteund door de provider, wordt de code voor groepsgewijze verbindingen de verbinding opnieuw wordt ingesteld en dat de verbinding is een geldig verkeerd geïnterpreteerd. Wanneer de clientcode een nieuwe verbinding geopend, kan de verbroken verbinding die is geretourneerd naar de groep worden opgehaald. Daarom wordt het foutbericht weergegeven dat wordt vermeld in de sectie 'Symptomen'.
Oplossing
Informatie over de hotfix
Een ondersteunde hotfix is nu beschikbaar bij Microsoft. Het is echter bedoeld om alleen het probleem dat wordt beschreven in dit artikel. Pas deze alleen toe op systemen waarop dit specifieke probleem zich voordoet. Deze hotfix moet wellicht extra worden getest. Als u geen ernstige problemen ondervindt, is het daarom raadzaam te wachten op het volgende servicepack waarin deze hotfix is opgenomen.U lost dit probleem meteen contact op met Microsoft Customer Support Services om de hotfix te verkrijgen. Voor een volledige lijst met telefoonnummers van Microsoft Customer Support Services en informatie over kosten van ondersteuning vindt u op de volgende Microsoft-website:
http://support.microsoft.com/contactus/?ws=supportOpmerking In speciale gevallen kunnen kosten die normaal aan ondersteuningsoproepen verbonden zijn, worden geannuleerd als een medewerker van Microsoft productondersteuning van mening is dat een specifieke update de oplossing van uw probleem is. De normale ondersteuningskosten blijven gelden voor extra ondersteuningsvragen die niet in aanmerking voor de specifieke update in kwestie komen.
Bestandsinformatie
De Engelse versie van deze hotfix heeft de bestandskenmerken (of recentere bestandskenmerken) die in de volgende tabel worden weergegeven. De datums en tijden voor deze bestanden worden weergegeven in Coordinated Universal Time (UTC). Wanneer u de bestandsinformatie weergeeft, wordt deze naar lokale tijd geconverteerd. Gebruik het tabblad tijdzone in het onderdeel datum en tijd in het Configuratiescherm om het verschil tussen UTC en lokale tijd.
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
Deze hotfix is beschikbaar als onderdeel van een cumulatieve hotfix-pakket. Wanneer u deze hotfix van Microsoft Product Support Services ontvangen, wordt het artikelnummer dat wordt vermeld in het hotfix-pakket worden 839801 voor MDAC 2.8 of 836799 voor MDAC 2.7 SP1. Zie voor meer informatie het volgende artikel in de Microsoft Knowledge Base:MDAC 2.8
839801 oplossen: Hotfixes zijn beschikbaar voor MDAC 2.8MDAC 2.7 SP1
836799 oplossen: Hotfixes zijn beschikbaar voor MDAC 2.7 Service Pack 1
Status
Microsoft heeft bevestigd dat dit probleem kan optreden in de Microsoft-producten die worden vermeld in de sectie 'Van toepassing op'.
Meer informatie
Stappen om het gedrag te reproduceren
-
Start Microsoft Visual Studio .NET.
-
Wijs in het menu bestandNieuw, en klik vervolgens op Project. Het dialoogvenster Nieuw Project wordt weergegeven.
-
Klik onder Project Types, klikt u op Visual Basic Projectsen klik op Consoletoepassingonder sjablonen.
-
Typ in het vak naam' Mijntoep ', en klik vervolgens op OK. Standaard wordt het bestand Module1.vb gemaakt.Als u Microsoft Visual C# .NET gebruikt, wordt het bestand Class1.cs gemaakt.
-
Voeg de volgende code boven:Microsoft Visual Basic .NET-code
Imports SystemImports System.Data.OleDb
Code van Visual C# .NET
using System.Data.OleDb;
-
Voeg de volgende code aan de hoofdprocedure: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()
Code van Visual C# .NET
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();
Opmerking Wijzig de verbindingsreeks op basis van uw omgeving.
-
Klik op het menu BuildOplossing bouwen.
-
Klik in het menu FoutopsporingStart. U ziet dat een opdracht wordt weergegeven in het consolevenster.
-
In Oracle SQL * Plus, voert u de opdracht die wordt weergegeven in het consolevenster.
-
Druk op ENTER. In het consolevenster ziet u de uitzondering die wordt vermeld in de sectie 'Symptomen'.
Referenties
Ga naar de volgende website van Microsoft Developer Network (MSDN) voor meer informatie over de Microsoft OLE DB-Provider voor Oracle:
http://msdn2.microsoft.com/en-us/library/ms810685.aspxVoor meer informatie klikt u op het volgende artikel in de Microsoft Knowledge Base:
824684 beschrijving van de standaardterminologie die wordt gebruikt om software-updates voor Microsoft te beschrijvenDe producten van andere leveranciers die in dit artikel worden beschreven, worden vervaardigd door bedrijven die onafhankelijk van Microsoft zijn. Microsoft biedt geen enkele garantie, impliciet noch anderszins, omtrent de prestaties of betrouwbaarheid van deze producten.