以下代码行有时导致“指定的强制转换无效”异常:
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;
}
}
在程序失败之前,程序会多次执行此功能。如果在新的执行线程中执行时失败,那么只有有时。当我调用在线程中执行处理的程序部分,并且它调用此函数时,它或者一直工作(=&gt;我单击按钮,它执行,没有错误,我点击并一次又一次地执行。 ..),或者它永远不会起作用(=&gt;我点击按钮然后执行,异常,我点击再次执行,再次执行异常......)。
lib.dbc - &gt; OleDbConnection类型的静态变量仅在程序启动时初始化,并且在整个代码中经常使用,有效
我不知道如何进一步调试它,最重要的是,对类型对象变量的赋值可能会失败? ExecuteScalar应返回object或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)
答案 0 :(得分:0)
试试这个,就像诊断工具一样:
public static object Select(string sql, OleDbTransaction dbt)
{
try
{
using (OleDbConnection con = new OleDbConnection(lib.dbc.ConnectionString))
using (OleDbCommand cmd = new OleDbCommand(sql, con, dbt))
{
object obj = cmd.ExecuteScalar();
return obj;
}
}
catch (Exception ex)
{
/* deleted code - error message to the user */
return null;
}
}
这可能有助于确定您是否遇到线程问题。
答案 1 :(得分:0)
如果在新的执行线程中执行时失败,则有时会失败。
此语句与您作为参数传递连接的事实相结合,表明您可能尝试在多个线程上使用相同的数据库连接,可能还有事务。
不要:每次要访问数据库时都要创建一个新连接:连接池意味着这将是有效的。