Příznaky

Připojení k databázi Oracle pomocí zprostředkovatele Microsoft OLE DB pro Oracle (MSDAORA) a pak ukončit připojení na straně serveru. Otevřít nové připojení k databázi Oracle z aplikace, zobrazí se následující chybová zpráva Výjimka:

System.Data.OleDb.OleDbException: Nespecifikovaná chyba
ORA-01012: Nepřihlášen

Příčina

Po ukončení připojení k databázi Oracle na straně serveru pomocí MSDAORA přerušeného připojení je vrácena do fondu připojení. Sdružování připojení kód nesprávně spolupracuje s vlastností ResetConnection MSDAORA. Pokud tato vlastnost není podporována zprostředkovatelem, sdružování kód nesprávně interpretuje, že připojení je ukončeno a že připojení je platná. Pokud klientský kód otevře nové připojení, může načíst přerušeného připojení, která byla vrácena do fondu připojení. Proto obdržíte chybovou zprávu, která je uvedena v části "Příznaky".

Řešení

Informace o opravě hotfix

Podporovaná oprava hotfix je nyní k dispozici od společnosti Microsoft. Je však určena opravit pouze problém popsaný v tomto článku. Použijte ji pouze u systémů, ve kterých dochází k tomuto konkrétnímu problému. Tato oprava hotfix může být dále testována. Proto pokud jste závažně tento problém, doporučujeme počkat další aktualizaci service pack, která obsahuje tuto opravu hotfix.

Chcete-li tento problém vyřešit okamžitě, obraťte se na technickou podporu společnosti Microsoft získat opravu hotfix. Úplný seznam telefonních čísel služeb podpory zákazníků společnosti Microsoft a informace o cenách podpory naleznete na následujícím webu společnosti Microsoft:

http://support.microsoft.com/contactus/?ws=supportPoznámka: Ve zvláštních případech mohou být stornovány poplatky, které jsou třeba obvykle zaplatit za telefonní hovory, pokud pracovník služeb podpory společnosti Microsoft určí, že konkrétní aktualizace odstraní váš problém. Výdaje na technickou podporu použije dalších otázek a problémů, které nelze vyřešit konkrétní aktualizací.

Informace o souborech

Anglická verze této opravy hotfix má atributy (nebo pozdější atributy souborů) uvedené v následující tabulce. Kalendářní data a časy jednotlivých souborů jsou uvedeny v koordinovaném světovém čase (UTC). Při zobrazení informací o souboru je převeden na místní čas. Rozdíl mezi časem UTC a místním časem, naleznete na kartě časové pásmo na panelu Datum a čas v okně Ovládací panely.

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
Součásti MDAC 2.7 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

Tato oprava hotfix je k dispozici jako součást balíčku kumulativní opravy hotfix. Obdržíte-li tuto opravu hotfix z Microsoft Product Support Services bude mít číslo článku, který je uveden v balíčku oprav hotfix 839801 pro součásti MDAC 2.8 nebo 836799 MDAC 2.7 SP1. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:



MDAC 2.8

839801 oprava: opravy hotfix jsou k dispozici pro součásti MDAC 2.8

SOUČÁSTI MDAC 2.7 SP1

836799 oprava: opravy hotfix jsou k dispozici pro součásti MDAC 2.7 Service Pack 1

Stav

Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části "Platí pro".

Další informace

Kroky pro reprodukci chování

  1. Spusťte aplikaci Visual Studio .NET.

  2. V nabídce soubor přejděte na příkaz
    Novýa potom klikněte na projekt. Zobrazí se dialogové okno Nový projekt .

  3. Ve skupinovém rámečku Typy projektůklepněte na tlačítko Projekty jazyka Visual Basica potom klepněte na tlačítko Aplikace konzolyv části šablony.

  4. Do pole název zadejte
    Aplikacea potom klepněte na tlačítko OK. Ve výchozím nastavení je vytvořen soubor Module1.vb.

    Pokud používáte Microsoft Visual C# .NET, je vytvořen soubor Class1.cs.

  5. Přidejte následující kód v horní:

    Kód Microsoft Visual Basic .NET

    Imports System
    Imports System.Data.OleDb

    Kód Visual C# .NET

    using System.Data.OleDb;
  6. Přidejte následující kód do procedury Main:

    Kód jazyka Visual Basic .NET

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

    Kód 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();

    Poznámka: Upravte připojovací řetězec podle vašeho prostředí.

  7. V nabídce sestavení klepněte na tlačítko Sestavit řešení.

  8. V nabídce Debug klepněte na tlačítko
    Spustit. Uvidíte, že příkaz je zobrazen v okně konzoly.

  9. V systému Oracle SQL * Plus, spusťte příkaz, který se zobrazí v okně konzoly.

  10. Stiskněte klávesu ENTER. V okně konzoly zobrazí výjimku, která je uvedena v části "Příznaky".

Odkazy

Další informace o Microsoft OLE DB Provider for Oracle naleznete následujícím webu Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms810685.aspxDalší informace získáte kliknutím na následující číslo v článku databáze Microsoft Knowledge Base:

824684 Popis standardní terminologie používané při popisu aktualizací softwaru společnosti Microsoft

Produkty třetích stran, které tento článek popisuje jsou vyráběny společnostmi nezávislými na společnosti Microsoft. Společnost Microsoft neposkytuje žádnou záruku, implicitně předpokládanou ani jinou, ohledně výkonu nebo spolehlivosti těchto produktů.

Potřebujete další pomoc?

Rozšiřte své znalosti a dovednosti

Projít školení >

Získejte nové funkce jako první

Připojit se k programu Microsoft Insider >

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?

Děkujeme vám za zpětnou vazbu.

×