狀況

您使用 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 產品的問題。

更多的資訊

重現問題的步驟

  1. 啟動 Microsoft Visual Studio .NET。

  2. 在 [檔案] 功能表上指向 [
    [新增],然後按一下 [專案新的專案] 對話方塊隨即出現。

  3. 在 [專案類型,請按一下 [ Visual Basic 專案中,,,然後在 [範本] 之下按一下 [主控台應用程式

  4. 在 [名稱] 方塊中,輸入
    MyApp,然後按一下[確定]。根據預設,會建立 Module1.vb 檔案。

    如果您使用 Microsoft Visual C#.NET 時,會建立 Class1.cs 檔。

  5. 在頂端加入下列程式碼:

    Microsoft Visual Basic.NET 程式碼

    Imports System
    Imports System.Data.OleDb

    Visual C#.NET 程式碼

    using System.Data.OleDb;
  6. 將下列程式碼加入至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();

    注意修改連接字串,根據您的環境而定。

  7. 按一下 [建置] 功能表的 [建置方案]。

  8. 在 [偵錯] 功能表上按一下
    [開始]。您會看到一個命令會顯示在主控台視窗。

  9. 在 Oracle SQL * 此外,執行時會顯示在主控台視窗的指令。

  10. 按下 ENTER 鍵。在 [主控台] 視窗中,您會看到 < 徵狀=""> 一節所述的例外狀況。

參考

如需有關 Microsoft OLE DB 提供者 oracle 的詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站:

http://msdn2.microsoft.com/en-us/library/ms810685.aspx如需其他資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:

用來描述 Microsoft 軟體更新標準術語的編號 824684描述

本文將所述之產品製造協力廠商均與 Microsoft 無關。Microsoft 對這些產品的效能或可靠性不作擔保,無論明示或暗示。

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×