ADO.NET 4.0中处理多个Excel文件的多个连接的正确方法是什么?

4

我有一段使用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);
    }
}

如果我对代码进行轻微修改,会发生几件事情:

  1. 如果我删除两个OleDbConnection.Open()的调用,则代码在.NET 2.0下可以正常工作,但在.NET 4.0下会崩溃。

  2. 如果我只删除第二个OleDbConnection.Open()的调用,则代码在.NET 2.0和.NET 4.0下都可以正常工作。不幸的是,我需要从两个单独的Excel文件中检索数据,并在每次事件被触发时填充两个单独的DataTable。

  3. 如果我使用上面代码中显示的两个OleDbConnection.Open()的调用,则代码在.NET 2.0和.NET 4.0下都可以正常工作,但是当用户点击按钮并运行该过程第二或第三次时,会在.NET 4.0下崩溃。

我的猜测是,.NET 4.0以不同的方式管理连接,而我可能漏掉了一些非常重要的步骤。

请问有谁能告诉我如何编写上述代码,使其在.NET 2.0和.NET 4.0下都可以正常工作?


3
正如我在你的另一个问题中提到的(https://dev59.com/FmbWa4cB1Zd3GeqPSQA7),请在`try/catch`块中包含`(Exception ex)`,以确保您知道异常信息。如果不确定,请使用Windows事件查看器查找异常。 - Jason Down
try/catch 块无法捕获异常。仅使用 catch 也无法捕获它。catch(Exception e) 也无法捕获它。 - John Smith
Jason,正如你建议的那样,我查看了事件日志。我发现以下内容:日志名称:应用程序。来源:应用程序挂起。程序<我的程序>停止与Windows交互并关闭。要查看有关问题的更多信息,请检查操作中心控制面板中的问题历史记录。当我单击详细信息选项卡并在二进制文件下检查时,它说“C.r.o.s.s.-.t.h.r.e.a.d ....”这怎么成为跨线程异常?为什么a)它不会在.NET 2.0中抛出,b)它在.NET 4.0中被抛出但没有被捕获? - John Smith
我研究了事件日志,并找到了对vrfcore.dll的引用。结果发现它与"应用程序验证器"有关。我从我的电脑上卸载了该程序,现在我的应用程序可以正常工作了。但仍然奇怪的是,我在.NET 2.0中没有遇到这个问题。无论如何,至少我让我的应用程序工作了。我仍然想知道为什么这个"应用程序验证器"程序会导致.NET 4.0出问题。 - John Smith
1
很高兴听到你解决了问题(尽管这还不是完全的解释)。 - Jason Down
你能告诉我在你的连接字符串中是否使用了Jet或Ace提供程序吗? - Robert
1个回答

0
问题出在“应用程序验证器”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接