ExecuteScalar“指定的强制转换无效”异常

时间:2014-02-15 18:58:33

标签: c# exception executescalar

以下代码行有时导致“指定的强制转换无效”异常:

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)

2 个答案:

答案 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)

  

如果在新的执行线程中执行时失败,则有时会失败。

此语句与您作为参数传递连接的事实相结合,表明您可能尝试在多个线程上使用相同的数据库连接,可能还有事务。

不要:每次要访问数据库时都要创建一个新连接:连接池意味着这将是有效的。