2

以下代码行有时会导致“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)
4

2 回答 2

0

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

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

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

于 2014-02-15T20:31:03.053 回答
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;
  }
}

这可能有助于确定您是否有线程问题。

于 2014-02-15T19:26:29.550 回答