メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

現象

Oracle (MSDAORA) の Microsoft OLE DB プロバイダーを使用して Oracle データベースに接続して、サーバー側の接続を終了します。アプリケーションから Oracle データベースに新しい接続を開くときは、次の例外エラー メッセージが表示されます。

System.Data.OleDb.OleDbException: 不明なエラー
ORA-01012: ログオンしていません。

原因

MSDAORA を使用しているときに、サーバー側での Oracle データベースへの接続を終了すると、切断された接続が接続プールに返されます。接続プールのコードが正しく MSDAORA のResetConnectionプロパティを使用して対話しています。このプロパティがプロバイダーによってサポートされていないと、プールのコード誤って解釈こと、接続がリセットされ、接続が有効なものになっています。クライアント コードは、新しい接続を開き、接続プールに返された、切断された接続が取得されます。そのため、「現象」に記載されているエラー メッセージが表示されます。

解決策

修正プログラムの情報

サポートされている修正プログラムはマイクロソフトから現在入手可能です。ただし、この資料に記載されている問題のみを修正するものです。この特定の問題が発生したシステムにのみ適用してください。この修正プログラムは、今後さらにテストを行うことがあります。この問題で深刻な影響を受けていない場合は、この修正プログラムを含む次の service pack のリリースを待つことを勧めします。

この問題を解決するには、修正プログラムを入手するのには、Microsoft カスタマー サポート サービスに問い合わせてください。マイクロソフト カスタマー サポート サービスの電話番号とサポートのコストに関する情報の一覧については、次のマイクロソフト Web サイトを参照してください。

http://support.microsoft.com/contactus/?ws=support注: 特別な場合では、まれに通常サポート コールの発生に料金 Microsoft Support 担当者は、特定の更新で問題が解決されると判断した。追加の質問および問題の特定のアップデートの対象にはなりませんが、通常のサポート料金が適用されます。

ファイル情報

修正プログラム (英語版) のファイル属性は次表のとおりです。ただし、これより新しい修正プログラムがリリースされている可能性もあります。各ファイルの日付および時刻は、世界協定時刻 (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

この修正プログラムは累積的な修正プログラム パッケージの一部として。この修正プログラムをマイクロソフト製品サポート サービスから受信すると、修正プログラム パッケージに記載されている資料番号になります MDAC 2.8 の 839801 または 836799 MDAC 2.7 SP1 用です。詳細については、マイクロソフト サポート技術情報の次の資料を参照してください。



MDAC 2.8

839801を修正: 修正プログラムは MDAC 2.8 で利用可能な

MDAC 2.7 SP1

836799の修正: 修正プログラムは MDAC 2.7 Service Pack の 1

状況

マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。

詳細

現象を再現する手順を実行します。

  1. Microsoft Visual Studio .NET を起動します。

  2. [ファイル] メニューのをポイントします。
    新規作成し、[プロジェクト] をクリックします。[新しいプロジェクト] ダイアログ ボックスが表示されます。

  3. [プロジェクトの種類Visual Basic プロジェクト] をクリックし、[テンプレート] でコンソール アプリケーションをクリックします。

  4. [名前] ボックスで次のように入力します。
    MyApp、し、[ OK] をクリックします。デフォルトで 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. [デバッグ] メニューで、次のようにクリックします。
    起動します。コマンドがコンソール ウィンドウに表示されることが表示されます。

  10. Oracle SQL * さらに、コンソール ウィンドウに表示されるコマンドを実行します。

  11. ENTER キーを押します。[コンソール] ウィンドウで、「現象」に記載されている例外を参照してください。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×