为什么我得到“;无效的强制转换异常“;使用此SQLite代码
本文关键字:异常 代码 转换 SQLite 无效 为什么 | 更新日期: 2023-09-27 18:29:14
我有这样的代码来从SQLite表中获取计数:
internal static bool TableExistsAndIsNotEmpty(string tableName)
{
int count;
string qry = String.Format("SELECT COUNT(*) FROM {0}", tableName);
using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection()))
{
con.Open();
SQLiteCommand cmd = new SQLiteCommand(qry, con);
count = (int)cmd.ExecuteScalar();
}
return count > 0;
}
当它运行时,我得到,"无效铸造异常"
很明显,从查询返回的值是int,也就是说记录的计数(当我运行查询时,我得到"2",即Sqlite Browser中的"SELECT count(*)from WorkTables")。
那么,这里无效铸造的是什么呢?
顺便说一句,我知道使用查询参数更好,我在这里的Windows应用商店应用程序中找到了如何做到这一点[我如何在WinRT应用程序中使用SQLite查询参数?,但不知道如何在旧的(Windows Forms/Windows CE)应用程序中做到。
我想应该是这样的:
string qry = "SELECT COUNT(*) FROM ?";
using (SQLiteConnection con = new SQLiteConnection(HHSUtils.GetDBConnection()))
{
con.Open();
SQLiteCommand cmd = new SQLiteCommand(con);
count = cmd.ExecuteScalar(qry, tableName);
}
但没有我尝试编译的同类。
在此上下文中,ExecuteScalar返回一个System.Int64
应用(int)强制转换会创建您看到的异常
object result = cmd.ExecuteScalar();
Console.WriteLine(result.GetType()); // System.Int64
你可以用Convert.ToInt32 解决你的问题
SQLiteCommand cmd = new SQLiteCommand(qry, con);
count = Convert.ToInt32(cmd.ExecuteScalar());