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í
-
Spusťte aplikaci Visual Studio .NET.
-
V nabídce soubor přejděte na příkaz
Novýa potom klikněte na projekt. Zobrazí se dialogové okno Nový projekt . -
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.
-
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. -
Přidejte následující kód v horní:
Kód Microsoft Visual Basic .NETImports System
Imports System.Data.OleDbKód Visual C# .NET
using System.Data.OleDb;
-
Přidejte následující kód do procedury Main:
Kód jazyka 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()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í.
-
V nabídce sestavení klepněte na tlačítko Sestavit řešení.
-
V nabídce Debug klepněte na tlačítko
Spustit. Uvidíte, že příkaz je zobrazen v okně konzoly. -
V systému Oracle SQL * Plus, spusťte příkaz, který se zobrazí v okně konzoly.
-
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ů.