5

这是一个使用 VS 2005 编写的 .NET 2.0 应用程序。它在运行 .NET 2.0 的系统上运行良好,但在运行 .NET 4.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 下工作,在 .NET 4.0 下崩溃

ConnectionStrings 1 和 2 引用不同的 .xls 文件。

我发现解决这个问题的方法是声明和初始化一个 OleDbConnection 类型的字段变量,在 OleDbDataAdapter 的 using 语句之前设置 ConnectionString 属性和 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 下硬崩溃(没有错误消息)的原因,但是在一次删除一行代码并一遍又一遍地重新编译后,我发现这是问题的原因.

我很高兴我解决了这个问题,但我对第一个代码不适用于 .NET 4.0 的事实并不满意。

有人可以解释一下为什么 .NET 4.0 不喜欢使用上述代码吗?

4

2 回答 2

3

问题是“应用程序验证程序”。卸载它解决了这个问题。

于 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 回答