Symptom
Du kan ansluta till en Oracle-databas med hjälp av Microsoft OLE DB Provider för Oracle (MSDAORA) och sedan avslutar du anslutningen på serversidan. När du öppnar en ny anslutning till Oracle-databasen i programmet visas följande felmeddelande för undantag:
System.Data.OleDb.OleDbException: Okänt fel
ORA-01012: inte inloggad
Orsak
När du avslutar anslutningen till Oracle-databasen på serversidan när du använder MSDAORA returneras avbrutna anslutningar till anslutningspoolen. Anslutning anslutningspoolen koden felaktigt samverkar med egenskapen ResetConnection för MSDAORA. När den här egenskapen inte stöds av providern, tolkar anslutningspoolen koden felaktigt att anslutningen återställs och att anslutningen är giltig. När klienten öppnas en ny anslutning kan bryts anslutningen som returnerades till anslutningspoolen hämtas. Därför visas felmeddelandet som nämns i avsnittet ”Symptom”.
Lösning
Information om snabbkorrigeringen
En snabbkorrigering är nu tillgänglig från Microsoft. Den är emellertid avsedd att åtgärda det problem som beskrivs i denna artikel. Använd den bara på datorer där detta problem uppstår. Snabbkorrigeringen kan komma att testas igen. Om inte störs alltför mycket av detta problem rekommenderar vi att du väntar på Nästa service pack som innehåller den här snabbkorrigeringen.
Om du vill lösa problemet omedelbart kontaktar du Microsoft support för att få snabbkorrigeringen. En fullständig lista över telefonnummer till Microsoft Customer Support Services och information om supportkostnader finns på följande Microsoft-webbplats:
http://support.microsoft.com/contactus/?ws=supportObs! I särskilda fall avbryts de avgifter som är normala för supportsamtal om en supporttekniker anser att en särskild uppdatering kan lösa ditt problem. De vanliga supportkostnaderna gäller för övriga supportfrågor och problem som inte berör den särskilda uppdateringen.
Filinformation
Den engelska versionen av den här snabbkorrigeringen har de filattribut (eller senare filattribut) som visas i följande tabell. Datum och tider för dessa filer anges i UTC-tid (UTC). När du visar filinformationen konverteras den till lokal tid. Använd fliken tidszon i verktyget datum och tid på Kontrollpanelen om du vill se skillnaden mellan UTC-tid och lokal tid.
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
Den här snabbkorrigeringen är tillgänglig som en del av en kumulativ snabbkorrigering. När du får den här snabbkorrigeringen från Microsoft Product Support Services är artikelnumret som anges i paketet 839801 för MDAC 2.8 eller 836799 för MDAC 2.7 SP1. Mer information finns i följande artikel i Microsoft Knowledge Base:
MDAC 2.8
839801 KORRIGERA: det finns snabbkorrigeringar för MDAC 2.8
MDAC 2.7 SP1
836799 KORRIGERA: det finns snabbkorrigeringar för MDAC 2.7 Service Pack 1
Status
Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet ”gäller”.
Mer Information
Åtgärder för att återskapa problemet
-
Starta Microsoft Visual Studio .NET.
-
På Arkiv -menyn, peka på
Nyoch sedan på projekt. Dialogrutan Nytt projekt visas. -
Klicka på Konsolprogramunder mallarunder ProjekttyperVisual Basic-projekt.
-
I rutan namn skriver du:
MyAppoch klicka sedan på OK. Som standard skapas filen Module1.vb.
Om du använder Microsoft Visual C# .NET, skapas filen Class1.cs. -
Lägg till följande kod överst:
Kod för Microsoft Visual Basic .NETImports System
Imports System.Data.OleDbVisual C# .NET-kod
using System.Data.OleDb;
-
Lägg till följande kod i Main-proceduren:
Kod i Visual Basic .NETDim 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-kod
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();Obs! Ändra anslutningssträngen efter din miljö.
-
Klicka på Skapa lösningpå Build -menyn.
-
Klicka på Felsök -menyn
Starta. Du ser att ett kommando visas i konsolfönstret. -
I Oracle SQL * Plus, kör du kommandot som visas i konsolfönstret.
-
Tryck på RETUR. I konsolträdet visas de undantag som nämns i avsnittet ”Symptom”.
Referenser
Mer information om Microsoft OLE DB Provider för Oracle finns på följande Microsoft Developer Network (MSDN)-webbplats:
http://msdn2.microsoft.com/en-us/library/ms810685.aspxFör ytterligare information klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:
824684 beskrivning av standardterminologin som används för att beskriva Microsoft-programuppdateringar
Tredjepartsprodukter som diskuteras i denna artikel tillverkas oberoende av Microsoft. Microsoft lämnar inga garantier, implicerade eller andra, vad gäller prestanda eller tillförlitlighet hos dessa produkter.