現象
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
状況
マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。
詳細
現象を再現する手順を実行します。
-
Microsoft Visual Studio .NET を起動します。
-
[ファイル] メニューのをポイントします。
新規作成し、[プロジェクト] をクリックします。[新しいプロジェクト] ダイアログ ボックスが表示されます。 -
[プロジェクトの種類のVisual Basic プロジェクト] をクリックし、[テンプレート] でコンソール アプリケーションをクリックします。
-
[名前] ボックスで次のように入力します。
MyApp、し、[ OK] をクリックします。デフォルトで 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 キーを押します。[コンソール] ウィンドウで、「現象」に記載されている例外を参照してください。