【发布时间】:2012-07-13 00:38:07
【问题描述】:
我有一段使用 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() 的两个调用,代码将在 .NET 2.0 中正常工作,但在 .NET 4.0 中会严重崩溃。
如果我只删除对 OleDbConnection.Open() 的第二次调用,则代码将在 .NET 2.0 和 .NET 4.0 中正常工作。唉,每次触发事件时,我都需要从两个单独的 excel 文件中检索数据并填充两个单独的数据表。
1234563用户点击按钮和程序运行的时间。
我的猜测是 .NET 4.0 管理连接的方式与 .NET 2.0 不同,我错过了一些非常重要的步骤。
谁能告诉我应该如何编写上面的代码,使其在 .NET 2.0 和 .NET 4.0 下可以正常工作?
【问题讨论】:
-
正如我在您的另一个问题 (stackoverflow.com/questions/11438952/…) 中提到的,将调用包装在
try/catch块中,确保包含(Exception ex)。这至少应该让您知道异常是什么。如有疑问,请使用 Windows 事件查看器查找异常。 -
try/catch 块没有捕获异常。 catch all 本身并不能捕获它。 catch(Exception e) 也没有捕捉到它。
-
Jason,正如你所说,我查看了事件日志。我发现以下内容:日志名称:应用程序。资料来源:应用程序挂起。程序 停止与 Windows 交互并被关闭。要查看有关问题的更多信息是否可用,请查看操作中心控制面板中的问题历史记录。当我单击详细信息选项卡并在二进制文件下检查时,它显示“C.r.o.s.s.-.t.h.r.e.a.d ....”这是一个跨线程异常吗?为什么 a) 它没有被 .NET 2.0 抛出并且 b) 它被抛出但没有被 .NET 4.0 捕获?
-
我研究了事件日志,发现了对 vrfcore.dll 的引用。原来它与“应用程序验证器”有关。我从我的 PC 上卸载了该程序,我的应用程序现在可以正常运行。 .NET 2.0 没有这个问题仍然很奇怪。无论如何,至少我的应用程序可以正常工作。我仍然想知道为什么这个 Application Verifier 程序会导致 .NET 4.0 出现问题
-
很高兴听到您解决了这个问题(尽管它仍然不是一个完整的解释)。
标签: excel .net-4.0 ado.net .net-2.0 oledb