狀況
您使用 Microsoft OLE DB 提供者的 Oracle (MSDAORA),連線到 Oracle 資料庫,然後在您結束在伺服器端連線。當您開啟新的連線到 Oracle 資料庫從應用程式時,您會收到下列的例外狀況錯誤訊息:
System.Data.OleDb.OleDbException: 未指定的錯誤
這個 01012: 未登入
原因
當您結束使用 MSDAORA 時在伺服器端的 Oracle 資料庫的連線時,就會中斷的連接傳回到連接集區中。此外,連線的共用程式碼不正確會與 MSDAORA 的ResetConnection屬性互動。當提供者不支援這個屬性,則共用的程式碼不正確解譯,連線重設時,以及連線有效。當用戶端程式碼開啟新的連線時,便可以擷取和傳回連接集區的連線中斷。因此,您會收到 < 徵狀=""> 一節所述的錯誤訊息。
解決方案
Hotfix 資訊
已經可以從 Microsoft 取得支援的 hotfix。不過,其旨在修正本文所述的問題。它只適用於發生此特定問題的系統上。此 hotfix 可能會接受其他測試。因此,如果這個問題不會嚴重影響,我們建議您等候下一個包含此 hotfix 的 service pack。
若要立即解決這個問題,請連絡 Microsoft 客戶支援服務 」 取得 hotfix。如需 Microsoft 客戶支援服務電話號碼以及支援費用的相關資訊的完整清單,請造訪下列 Microsoft 網站︰
http://support.microsoft.com/contactus/?ws=support注意 在特殊的情況下,如果 Microsoft 支援專業人員認為某特定更新程式可以解決您的問題時,可能就不會收取一般因支援電話所產生的費用。收取支援費用會套用,如果有其他支援問題是,不能限定的特定更新程式。
檔案資訊
此 hotfix 的英文版具有下列表格中所列檔案屬性 (或較新的檔案屬性)。這些檔案的日期和時間會以國際標準時間 (UTC) 格式列出。當您檢視檔案資訊時,會將它轉換為本地時間。若要查看 UTC 與當地時間的時差,請在 [控制台] 中的 [日期和時間] 工具中使用 [時區] 索引標籤。
Microsoft 資料存取元件 (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 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
此 hotfix 是可用的累積的 hotfix 套件的一部分。當您收到此 hotfix,從 Microsoft 產品支援服務時,hotfix 套件中所列的文件編號會 MDAC 2.8 的 839801 或 836799 MDAC 2.7 sp1。如需詳細資訊,請參閱下列的文件 「 Microsoft 知識庫 」 中的文:
MDAC 2.8
839801修正: Hotfix 可供 MDAC 2.8
MDAC 2.7 SP1
836799修正: Hotfix 可供 MDAC 2.7 Service Pack 1
狀態
Microsoft 已確認這是<套用>一節所列出的 Microsoft 產品的問題。
更多的資訊
重現問題的步驟
-
啟動 Microsoft Visual Studio .NET。
-
在 [檔案] 功能表上指向 [
[新增],然後按一下 [專案。新的專案] 對話方塊隨即出現。 -
在 [專案類型,請按一下 [ Visual Basic 專案中,,,然後在 [範本] 之下按一下 [主控台應用程式。
-
在 [名稱] 方塊中,輸入
MyApp,然後按一下[確定]。根據預設,會建立 Module1.vb 檔案。
如果您使用 Microsoft Visual C#.NET 時,會建立 Class1.cs 檔。 -
在頂端加入下列程式碼:
Microsoft Visual Basic.NET 程式碼Imports System
Imports System.Data.OleDbVisual C#.NET 程式碼
using System.Data.OleDb;
-
將下列程式碼加入至Main程序中:
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()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();注意修改連接字串,根據您的環境而定。
-
按一下 [建置] 功能表的 [建置方案]。
-
在 [偵錯] 功能表上按一下
[開始]。您會看到一個命令會顯示在主控台視窗。 -
在 Oracle SQL * 此外,執行時會顯示在主控台視窗的指令。
-
按下 ENTER 鍵。在 [主控台] 視窗中,您會看到 < 徵狀=""> 一節所述的例外狀況。
參考
如需有關 Microsoft OLE DB 提供者 oracle 的詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站:
http://msdn2.microsoft.com/en-us/library/ms810685.aspx如需其他資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
用來描述 Microsoft 軟體更新標準術語的編號 824684描述
本文將所述之產品製造協力廠商均與 Microsoft 無關。Microsoft 對這些產品的效能或可靠性不作擔保,無論明示或暗示。