2014-11-05 4 views
0

Я получил этот код, чтобы получить количество из SQLite таблицы:Почему я получаю «Invalid Cast Exception» с этим кодом 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» при запуске запроса, а именно «SELECT COUNT (*) FROM WorkTables» в Sqlite Browser).

Итак, что здесь недействительно брошено?

В качестве своего рода примечания, я знаю, что лучше использовать параметры запроса, и я узнал, как это сделать в приложении для Windows Store здесь [How can I use SQLite query parameters in a WinRT app?, но не знаю, как это сделать в старомодном (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); 
} 

... но ничего из иже, что я попытался скомпилировать.

+1

Для примечания: Вы не можете заменить параметры для имен таблиц , только для значений. Ваш 'String.Format' отлично работает здесь, пока' tableName' не поступает с пользовательского ввода. –

+2

'Итак, что здесь недействительно отбрасывается? Исключение, которое вы получаете, может сказать строку. –

+0

@ L.B: Нет, это все, что он говорит. –

ответ

7

В этом контексте 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()); 
+1

Пробовал 1.0.92 версию SQLite и возвращает System.Int64. Попробуйте сами с кодом выше. – Steve

+1

Вы меня смутили, я пропустил SQLite. Я отменит свой голос и комментарий из-за незнания этой платформы. –

+0

@ AnthonyPegram не проблема Я признаю вашу готовность помочь. – Steve