FIX: Foutbericht 'ORA-01012'-foutbericht wanneer u verbinding met een Oracle-database met behulp van MSDAORA

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

  1. Start Microsoft Visual Studio .NET.

  2. Wijs in het menu bestand
    Nieuw, en klik vervolgens op Project. Het dialoogvenster Nieuw Project wordt weergegeven.

  3. Klik onder Project Types, klikt u op Visual Basic Projectsen klik op Consoletoepassingonder sjablonen.

  4. 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.

  5. Voeg de volgende code boven:

    Microsoft Visual Basic .NET-code

    Imports System
    Imports System.Data.OleDb

    Code van Visual C# .NET

    using System.Data.OleDb;
  6. Voeg de volgende code aan de hoofdprocedure:

    Visual Basic .NET-code

    Dim 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.

  7. Klik op het menu BuildOplossing bouwen.

  8. Klik in het menu Foutopsporing
    Start. U ziet dat een opdracht wordt weergegeven in het consolevenster.

  9. In Oracle SQL * Plus, voert u de opdracht die wordt weergegeven in het consolevenster.

  10. 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.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Hoe tevreden bent u met de vertaalkwaliteit?

Wat heeft uw ervaring beïnvloed?

Hebt u aanvullende feedback? (Optioneel)

Bedankt voor uw feedback.

×