using (OleDbCommand cmd = new OleDbCommand(cmdText, WFConn))
{
int val = 0;
AddParameterToODBComm(cmd, Type);
AddParameterToODBComm(cmd, Year);
try
{
WFConn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
reader.Read();
val = (int)reader[0];
}
catch (Exception ex) { MessageBox.Show(ex.Message); return 0; }
finally { WFConn.Close(); }
return (int)(val * ((int)numCount.Value * 0.01)); //Throws an InvalidComObjectException, but still works.
}
此代码块完全按照我的意愿工作(返回记录集大小的百分比),但每次运行时,我都会在COM object that has been separated from its underlying RCW cannot be used
异常的最后一行调入调试器
事先,返回(int)等等在try块内,异常发生在finally块中的Connection.Close()上。
我在同一个问题的两个地方发生了这种情况。事情是,如果我继续该计划,一切都正常工作的预期。我在SO上检查了与此异常相关的其他问题,但它们指的是手动处理/释放COM对象,我不打算在这里做。
这里发生了什么,我只是没有看到?这肯定与关闭连接有关 - 我可以把它打开,但我有一个问题,期望它是开放的,而不是。
答案 0 :(得分:3)
我相信在调用连接上的close方法而不在读取器上调用它时,您将获得异常。快速修复可能只是在WFConn.Close()之前调用reader.Close()。
或者,确保将WFConn包装在using语句中 - 新连接。然后就不需要显式关闭连接。它将通过using语句自动关闭和处理,读者也一样。 OleDbCommand use
的示例public void ReadMyData(string connectionString)
{
string queryString = "SELECT OrderID, CustomerID FROM Orders";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
using (OleDbCommand command = new OleDbCommand(queryString, connection))
{
connection.Open();
using (OleDbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader.GetInt32(0) + ", " + reader.GetString(1));
}
}
}
}
}
由于OleDbDataReader
是IDisposable
,所以最好将它包装在using
语句以及连接中,这样可以提前释放其非托管资源,而不是等到垃圾收集器调用读者的finalize方法。这样可以防止忘记在连接上忘记关闭阅读器。编译器将为您生成一个try / finally块,并为每个块添加close / dispose。您正在使用OleDbCommand实例正确观察IDisposable模式。