您目前已離線,請等候您的網際網路重新連線

FIX: 您收到 「 ORA-01012 」 錯誤訊息當您連線到 Oracle 資料庫時使用 MSDAORA

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:834905
徵狀
您連線到 Oracle 資料庫藉由使用 Microsoft OLE DB 提供者對於 Oracle (MSDAORA),並再您結束在伺服器端連線。當您從您的應用程式開啟 Oracle 資料庫的新連線時,您會收到下列的例外狀況錯誤訊息:
System.Data.OleDb.OleDbException: 未指定的錯誤
ORA-01012: 未登入
發生的原因
最後時使用 MSDAORA 至 Oracle 資料庫在伺服器端連接您中斷的連線就會傳回至連接集區。連接共用程式碼不正確地相互作用的 MSDAORA ResetConnection 屬性。當提供者不支援這個屬性時,共用的程式碼不正確解譯會重設連線,並連接是有效的一個。當用戶端程式碼會開啟新連線時,可能會擷取已傳回到連接集區的中斷的連線。因此,您收到 < 徵狀 > 一節所述之錯誤訊息。
解決方案

Hotfix 資訊

一個支援的 Hotfix 現在已可從 Microsoft取得。不過,它只修正本文中所述此問題。請只在發生此特定問題的系統上套用。此 Hotfix 可能會接受其他測試。因此,如果您不會嚴重影響這個問題,我們建議您等候下一個包含此 Hotfix 的 Service Pack。

如果要立即解決這個問題,請聯絡 Microsoft 客戶支援服務 」,以取得該 Hotfix。如需 Microsoft 客戶支援服務電話號碼及支援成本的相關資訊的完整清單,請造訪下列 Microsoft 網站]:附註 在特殊情況下通常會因支援電話所產生的費用可能就不收取如果 Microsoft 支援人員認為某特定更新程式可以解決您的問題。平常的支援成本將會套用到其他支援問題是所做不限定特定有問題的更新程式。

檔案資訊

此 Hotfix 的英文版在檔案屬性 (或更新版本的檔案屬性) 如下列表格中所列。這些檔案的日期和時間為 Coordinated Universal Time (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 服務封裝 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 套件的一部分。當您從 Microsoft 產品支援服務 」 收到此 Hotfix 時,Hotfix 套件中所列的文件編號將會是 MDAC 2.8 的 839801 或 MDAC 2.7 SP1 的 836799。如需詳細資訊請參閱下列的 「 Microsoft 知識庫 」 中的文件:

MDAC 2.8
839801FIX: Hotfix 可供 MDAC 2.8
MDAC 2.7 SP1
836799FIX: 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 鍵。在 [主控台] 視窗會看到 < 徵狀 > 一節所述的例外狀況。
参考
對於 Oracle Microsoft OLE DB 提供者的相關資訊,請造訪下列 Microsoft 開發 o 人 h 員 û 工 u 具 ã 網路 (MSDN) 網站]:如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明
在本文所討論的協力廠商產品是由 Microsoft 以外的公司所製造的。Microsoft 可讓不以暗示或其他方式,效能或可靠性這些產品的保證。
OLEDB; MSDAORA; 連接共用 ; 終止工作階段 ; Oracle; OleDbException

警告:本文為自動翻譯

內容

文章識別碼:834905 - 最後檢閱時間:11/15/2007 14:12:14 - 修訂: 3.6

Microsoft Data Access Components 2.8, Microsoft Data Access Components 2.7 Service Pack 1

  • kbmt kbhotfixserver kbqfe kbbug kbprovider kbconnectivity kbdatabase kboracle kbfix kbqfe KB834905 KbMtzh
意見反應