繁体   English   中英

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

[英]ExecuteScalar “Specified cast is not valid” exception

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

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应该返回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)

尝试将其作为诊断工具:

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;
  }
}

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

如果在新的执行线程中执行时olny失败,则仅在某些时候执行。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM