C# “行政许可证”;指定的强制转换无效";例外

C# “行政许可证”;指定的强制转换无效";例外,c#,exception,executescalar,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; }

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

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

尝试以下方法,就像诊断工具一样:

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失败,并且只是偶尔失败

此语句,再加上您将连接作为参数传递的事实,表明您可能试图在多个线程上使用相同的数据库连接,也可能是事务


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

这里的SQL是什么?您是否真的发出了一个查询,结果是一个值?您是否在多个线程上共享同一个连接?ADO.NET不是为此而设计的@JonSkeet
ExecuteScalar
返回“结果集中第一行的第一列,如果结果集为空,则返回空引用。”@C.Evenhuis:好的观点。穿线问题很可能就是问题所在。对于IMO中包含多个列/行的结果,使用ExecuteScalar仍然不是一个好主意,但它不应该给出此错误。SQL总是“选择…”。它返回的内容应该不重要,它只会导致逻辑错误,因为函数是一个包装器,用于管理任何选择结果。关于线程,我有一个主线程,对于这个特殊的情况(长执行),它产生了另外两个线程——一个SQL处理线程和一个对话线程。我找到了一些可能需要ApartmentState=ApartmentState.MTA用于我的线程的信息,我不知道这是什么。在任何给定时刻,只有一个线程执行SQL操作。我的函数返回一个数据或null,这就是它的工作。是的,我正在共享数据库连接,不知道在多线程环境中它会造成如此大的破坏。当我没有在线程之间共享连接时,我没有设法重现错误。谢谢
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;
  }
}