VS 2005 を使用して記述されたコードは、.NET 2.0 を実行しているコンピューターでは問題なく動作しますが、.NET 4.0 を実行しているコンピューターではハード クラッシュします。
問題の原因となっているコードのセクションは、DataAdapter の Fill() メソッドの呼び出しです。コードは次のようになります。
private void button_Click(object sender, EventArgs e)
{
DataTable dt1 = new DataTable();
string connectionString = ... //connects to excelfile1.xls
string selectCommand = "SELECT * FROM [Sheet1$]";
using(OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connectionString))
{
adapter.SelectCommand.Connection.Open();
adapter.Fill(dt1);
}
DataTable dt2 = new DataTable();
connectionString = ... //connects to excelfile2.xls
using(OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connectionString))
{
adapter.SelectCommand.Connection.Open();
adapter.Fill(dt2);
}
}
コードにわずかな変更を加えると、いくつかのことが起こります。
OleDbConnection.Open() への 2 つの呼び出しを削除すると、コードは .NET 2.0 では問題なく動作しますが、.NET 4.0 ではハード クラッシュします。
OleDbConnection.Open() への 2 番目の呼び出しだけを削除すると、コードは .NET 2.0 および .NET 4.0 で正常に動作します。残念ながら、イベントが発生するたびに、2 つの個別の Excel ファイルからデータを取得し、2 つの個別の DataTable に入力する必要があります。
上記のコードに示すように、OleDbConnection.Open() の両方の呼び出しを使用すると、コードは .NET 2.0 と .NET 4.0 で正常に動作しますが、ユーザーが 2 回目または 3 回目にクリックすると、.NET 4.0 でハード クラッシュが発生します。ボタンをクリックすると、プロシージャが実行されます。
私の推測では、.NET 4.0 は .NET 2.0 とは異なる方法で接続を管理しており、非常に重要な手順がいくつか欠けています。
上記のコードを .NET 2.0 および .NET 4.0 で正常に動作するように記述する方法を教えてください。