Objawy
Łączenie z bazą danych Oracle przy użyciu dostawcy Microsoft OLE DB dla programu Oracle (MSDAORA), a następnie zakończyć połączenie po stronie serwera. Podczas otwierania nowego połączenia z bazą danych Oracle z poziomu aplikacji, pojawi się następujący komunikat o błędzie wyjątku:
System.Data.OleDb.OleDbException: Nieokreślony błąd
ORA-01012: nie zalogowany
Przyczyna
Po zakończeniu połączenia z bazą danych Oracle po stronie serwera podczas korzystania z MSDAORA przerwane połączenie zostało zwrócone do puli połączeń. Kod buforowania połączenia niepoprawnie współdziała z właściwością ResetConnection MSDAORA. Gdy ta właściwość nie jest obsługiwana przez dostawcę, buforowania kod nieprawidłowo interpretuje, że połączenie jest zresetowane, a połączenie jest prawidłowa. Jeśli kod klienta zostanie otwarte nowe połączenie, może pobrać przerwane połączenia, który został zwrócony do puli połączeń. W związku z tym zostanie wyświetlony komunikat o błędzie wymieniony w sekcji "Symptomy".
Rozwiązanie
Informacje o poprawce
Obsługiwana poprawka jest obecnie udostępniana przez firmę Microsoft. Jednak jest ona przeznaczona do usunięcia tylko problemu opisanego w tym artykule. Zastosuj ją tylko w systemach, w których występuje ten problem. Ta poprawka może być wciąż w fazie testowania. Jeśli dany system nie jest poważnie narażony na ten problem, firma Microsoft zaleca, aby poczekać na następny dodatek service Pack zawierający tę poprawkę.
Aby natychmiast rozwiązać ten problem, skontaktuj się z biurem obsługi klienta Microsoft w celu uzyskania poprawki. Aby uzyskać pełną listę numerów telefonów pomocy technicznej firmy Microsoft oraz informacje o pomocy technicznej odwiedź następującą witrynę firmy Microsoft w sieci Web:
http://support.microsoft.com/contactus/?ws=supportUwaga W wyjątkowych przypadkach opłaty za połączenie z pomocą techniczną mogą zostać anulowane, jeśli specjalista firmy Microsoft zdecyduje że określona aktualizacja, może rozwiązać Twój problem. Koszty obsługi zwykłych zastosuje się do dodatkowych pytań i problemów, których nie można rozwiązać przy użyciu określonej aktualizacji.
Informacje o plikach
Wersja anglojęzyczna tej poprawki ma atrybuty plików (lub nowsze) wymienione w poniższej tabeli. Daty i godziny odpowiadające tym plikom zostały podane w formacie uniwersalnego czasu koordynowanego (UTC, Coordinated Universal Time). Po wyświetleniu informacji o pliku są konwertowane na czas lokalny. Aby zobaczyć różnicę między czasem UTC i czasem lokalnym, należy użyć z karty Strefa czasowa w narzędziu Data i godzina w Panelu sterowania.
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 z dodatkiem Service Pack 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
Ta poprawka jest dostępna jako część pakiet zbiorczy poprawek. Po otrzymaniu tej poprawki od Microsoft Product Support Services, numer artykułu, który znajduje się w pakiecie poprawek będzie 839801 dla składników MDAC 2.8 lub 836799 dla składników MDAC 2.7 z dodatkiem SP1. Aby uzyskać więcej informacji zobacz następujący artykuł z bazy wiedzy Microsoft Knowledge Base:
MDAC 2.8
NAPRAW 839801 : poprawki są dostępne dla składników MDAC 2.8
MDAC 2.7 Z DODATKIEM SP1
NAPRAW 836799 : poprawek dostępnych dla składników MDAC 2.7 z dodatkiem Service Pack 1
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji „Dotyczy”.
Więcej informacji
Kroki do odtworzenia problemu
-
Uruchom program Microsoft Visual Studio .NET.
-
W menu plik wskaż polecenie
Nowy, a następnie kliknij polecenie Projekt. Zostanie wyświetlone okno dialogowe Nowy projekt . -
W obszarze Project Typeskliknij przycisk Projekty języka Visual Basic, a następnie kliknij Aplikacji konsoliw obszarze Szablony.
-
W polu Nazwa wpisz
Program MyApp, a następnie kliknij przycisk OK. Domyślnie tworzony jest plik Module1.vb.
Jeśli używasz Microsoft Visual C# .NET, jest tworzony plik Class1.cs. -
Dodaj następujący kod u góry:
Kod programu Microsoft Visual Basic .NETImports System
Imports System.Data.OleDbKodu Visual C# .NET
using System.Data.OleDb;
-
Dodaj następujący kod do procedury głównego:
Kod języka 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()Kodu 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();Uwaga Zmodyfikować ciąg połączenia, zależnie od Twojego środowiska.
-
W menu Tworzenie kliknij polecenie Build Solution.
-
W menu Debugowanie kliknij przycisk
Start. Możesz zobaczyć, że polecenie jest wyświetlane w oknie konsoli. -
W Oracle SQL * Plus, uruchom polecenie, który jest wyświetlany w oknie konsoli.
-
Naciśnij klawisz ENTER. W oknie konsoli Zobacz wyjątek, który jest wymieniony w sekcji "Symptomy".
Powiązane artykuły
Aby uzyskać więcej informacji o programie Microsoft OLE DB Provider for Oracle odwiedź następującą witrynę Microsoft Developer Network (MSDN) w sieci Web:
http://msdn2.microsoft.com/en-us/library/ms810685.aspxAby uzyskać dodatkowe informacje, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
824684 Opis standardowej terminologii używanej do opisywania aktualizacji oprogramowania firmy Microsoft
Produkty innych firm omówione w tym artykule są wytwarzane przez producentów niezależnych od firmy Microsoft. Firma Microsoft nie udziela żadnych gwarancji, domyślnych ani żadnego innego rodzaju, odnośnie do wydajności lub niezawodności tych produktów.