![](/img/trans.png)
[英]System.InvalidCastException: Specified cast is not valid at .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.