狀況

您使用 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.8MDAC 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 SystemImports System.Data.OleDb

    Visual C#.NET 程式碼

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

    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 對這些產品的效能或可靠性不作擔保,無論明示或暗示。

需要更多協助嗎?

想要其他選項嗎?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。