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 fout
ORA-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.8
MDAC 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 bestand
Nieuw, 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-codeImports System
Imports System.Data.OleDbCode van Visual C# .NET
using System.Data.OleDb;
-
Voeg de volgende code aan de hoofdprocedure:
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()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 Foutopsporing
Start. 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 beschrijven
De 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.