Почему я получаю Invalid Cast Exception с этим кодом SQLite?

У меня есть этот код, чтобы получить счет из таблицы 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) .

Так что же здесь недопустимо?

В качестве примечания я знаю, что лучше использовать параметры запроса, и я узнал, как это сделать в приложении Магазина Windows, здесь [Как я могу использовать параметры запроса SQLite в приложении WinRT?, но не знаю, как это сделать в старомодное (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);
}

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


person B. Clay Shannon    schedule 05.11.2014    source источник
comment
Для примечания: вы не можете заменять параметры именами таблиц, только значениями. Ваш String.Format прекрасно подходит здесь, пока tableName не исходит из пользовательского ввода.   -  person Lucas Trzesniewski    schedule 06.11.2014
comment
So what is being invalidly cast here? Исключение, которое вы получите, может сказать строку.   -  person L.B    schedule 06.11.2014
comment
@LB: Нет, это все, что здесь сказано.   -  person B. Clay Shannon    schedule 06.11.2014
comment
Исключение без трассировки стека?   -  person L.B    schedule 06.11.2014
comment
@LB: это исключение во время разработки; это все, что это дает мне. Возможно, соответствующее предупреждение, которое я только что заметил, говорит: Предупреждение 1 Элемент «метаданные» имеет недопустимый дочерний элемент «тип». Ожидается список возможных элементов: 'value'. C:\Handheld21\HHS\frmNewDelivery.resx   -  person B. Clay Shannon    schedule 06.11.2014


Ответы (1)


В этом контексте 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());
person Steve    schedule 05.11.2014
comment
Пробовал с версией SQLite 1.0.92, и он возвращает System.Int64. Попробуйте сами с кодом выше. - person Steve; 06.11.2014
comment
Вы меня смутили, я пропустил SQLite. Я отменю свой голос и комментарий из-за незнания этой платформы. - person Anthony Pegram; 06.11.2014
comment
@AnthonyPegram нет проблем, я признаю вашу готовность помочь. - person Steve; 06.11.2014
comment
Должен добавить, что этот же код в Sql Server работает без исключений. - person Steve; 06.11.2014
comment
Ага, сейчас работает отлично. Я постараюсь учесть это в моем проекте приложения Магазина Windows, в котором используется SQLite, так как я считаю, что то же самое применимо и в этом дивном новом мире. - person B. Clay Shannon; 06.11.2014