1

我有这段代码可以从 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;
}

当它运行时,我得到“ Invalid Cast Exception

可能很明显,从查询返回的值是一个 int,也就是说记录数(我在运行查询时得到“2”,即 Sqlite Browser 中的“SELECT COUNT(*) FROM WorkTables”) .

那么这里无效转换的是什么?

作为一种旁注,我知道最好使用查询参数,并且我在这里找到了如何在 Windows 应用商店应用程序中执行此操作 [如何在 WinRT 应用程序中使用 SQLite 查询参数?,但不知道如何在老式(Windows 窗体/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);
}

...但是我尝试编译的同类内容都没有。

4

1 回答 1

9

在这种情况下,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());
于 2014-11-05T23:29:25.877 回答