为什么当我使用没有OleDBConnection对象的OleDbDataAdapter对象时,.NET 2.0应用程序在.NET 4.0下崩溃?

这是一个使用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文件。

我发现解决这个问题的方法是声明和初始化OleDbConnectiontypes的字段variables,在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不喜欢使用上面的代码吗?

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

在你原来的代码中(没有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"); } } }