以下代码行有时会导致“Specified cast is not valid”异常:
public static object Select(string sql, OleDbTransaction dbt)
{
try
{
OleDbCommand cmd = new OleDbCommand(sql, lib.dbc, dbt);
object obj = cmd.ExecuteScalar(); /* <- this is what fails */
return obj;
}
catch (Exception ex)
{
/* deleted code - error message to the user */
return null;
}
}
该函数在程序中执行了多次,然后才会失败。如果在新的执行线程中执行时 olny 失败,然后仅有时. 当我调用在线程中执行处理的程序部分并调用此函数时,它要么一直工作(=>我单击按钮,它执行,没有错误,我一次又一次地单击并执行.. .),或者它永远不会起作用(=>我单击按钮并执行,异常,我再次单击并执行,再次异常......)。
lib.dbc -> OleDbConnection 类型的静态变量仅在程序启动时初始化并在整个代码中经常使用,有效
我不知道如何进一步调试它,最重要的是,对 object 类型的变量的哪些赋值可能会失败?ExecuteScalar 应该返回对象或 null。我使用的数据库是 Jet (MS Access)。
在我发现这个堆栈跟踪的异常中,也许它可以提供帮助:
at System.Data.OleDb.OleDbConnection.IOpenRowset()
at System.Data.OleDb.OleDbCommand.ExecuteTableDirect(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteScalar()
at FK.sql.Select(String sql, OleDbTransaction dbt)