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łądORA-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.8MDAC 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

  1. Uruchom program Microsoft Visual Studio .NET.

  2. W menu plik wskaż polecenieNowy, a następnie kliknij polecenie Projekt. Zostanie wyświetlone okno dialogowe Nowy projekt .

  3. W obszarze Project Typeskliknij przycisk Projekty języka Visual Basic, a następnie kliknij Aplikacji konsoliw obszarze Szablony.

  4. W polu Nazwa wpiszProgram 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.

  5. Dodaj następujący kod u góry:Kod programu Microsoft Visual Basic .NET

    Imports SystemImports System.Data.OleDb

    Kodu Visual C# .NET

    using System.Data.OleDb;
  6. Dodaj następujący kod do procedury głównego:Kod języka Visual Basic .NET

    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()

    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.

  7. W menu Tworzenie kliknij polecenie Build Solution.

  8. W menu Debugowanie kliknij przyciskStart. Możesz zobaczyć, że polecenie jest wyświetlane w oknie konsoli.

  9. W Oracle SQL * Plus, uruchom polecenie, który jest wyświetlany w oknie konsoli.

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

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.