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á chybaORA-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.8SOUČÁ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říkazNový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 zadejteAplikacea 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 SystemImports 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 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()

    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čítkoSpustit. 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 MicrosoftProdukty 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?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.