これはVS 2005を使用して作成された.NET 2.0アプリケーションです。.NET 2.0を実行しているシステムでは正常に動作しますが、.NET 4.0を実行しているシステムではハードクラッシュします。ここでは、コードのクリティカルセクションがあります:OleDBConnectionオブジェクトなしでOleDbDataAdapterオブジェクトを使用すると、.NET 4.0アプリケーションが.NET 2.0アプリケーションでクラッシュするのはなぜですか?
string selectCommand1 = ....
string connectionString1 = ....
using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand1, connectionString1))
{
try
{
adapter.Fill(table1);
}
catch
{
MessageBox.Show("error");
}
}
string selectCommand2 = ....
string connectionString2 = ....
using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand2, connectionString2))
{
try
{
adapter.Fill(table2);
}
catch
{
MessageBox.Show("error");
}
}
ここでも、それは.NET 4.0
のconnectionStrings 1 & 2参照異なる.xlsファイルの下でクラッシュし、.NET 2.0の下で動作します。
この問題を回避する方法は、OleDbConnection型のフィールド変数を宣言して初期化し、ConnectionStringプロパティを設定し、OleDbDataAdapterのusingステートメントの前にOpen()することです。よう:
OleDbConnection connection = new OleDbConnection();
.......
connection.ConnectionString = connectionString1;
connection.Open();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand1, connection))
{
try
{
adapter.Fill(table1);
}
catch
{
MessageBox.Show("error");
}
}
connection.Close();
connection.ConnectionString = connectionString2;
connection.Open();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand2, connection))
{
try
{
adapter.Fill(table2);
}
catch
{
MessageBox.Show("error");
}
}
これは私のアプリは、ハード.NET 4.0の下で(エラーメッセージ)をクラッシュしなかった理由であると信じてするのは難しいですが、一度にコード1行を削除し、何度も再コンパイルした後私はそれが問題の原因であることを発見しました。
私はこの問題を解決してうれしいですが、.NET 4.0では最初のコードが動作しないという事実に満足できません。
誰かが.NET 4.0が上記のようなコードで動作しない理由を説明できますか?
MSDNによれば、使用しているOleDbDataAdapterコンストラクタは、暗黙的に作成された接続を開きません。 http://msdn.microsoft.com/en-us/library/2f8y4737%28v=vs.100%29ただし、そのドキュメントの2.0バージョンを見ると、同じ警告が表示されます。 –
これは面白いです。それでもなぜそれが.net 2.0では動作するのかという疑問に答えることはできません.net 4.0 –
Windowsイベントログをチェックして、クラッシュのヒントがあるかどうかを確認しましたか?あなたはキャッチをしているだけです...もしあなたが 'catch(Exception ex){MessageBox.Show(ex.Message);}'? –