5

これは、VS2005を使用して作成された.NET2.0アプリケーションです。.NET2.0を実行しているシステムでは正常に動作しますが、.NET4.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 2.0で動作し、.NET4.0でクラッシュします

ConnectionStrings 1および2は、異なる.xlsファイルを参照します。

この問題を回避する方法は、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");
            }
        }

これが私のアプリが.NET4.0でハードクラッシュした(エラーメッセージが表示されなかった)理由であるとは信じがたいですが、コードの行を1つずつ削除して何度も再コンパイルした後、それが問題の原因であることがわかりました。

問題を解決できてうれしいですが、最初のコードが.NET4.0で機能しないという事実に満足していません。

誰かが.NET4.0が上記のようなコードで動作するのを好まない理由を説明できますか?

4

2 に答える 2

3

問題は「Application Verifier」でした。アンインストールすると問題が解決しました。

于 2012-07-17T20:32:06.213 に答える
2

元のコード (connection.open なし) では、呼び出す前にテーブルを初期化しましたadapter.Fill(table1)か?

    using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand1, connectionString1))
    {
        using (System.Data.DataTable table1 = new System.Data.DataTable()) {

            try
            {
                adapter.Fill(table1);
            }
            catch
            {
               MessageBox.Show("error");
            }
        }
    }
于 2012-07-11T19:05:14.143 に答える