Как исправить «исключение SQLite, недостаточные параметры, предоставленные команде» при использовании оператора INSERT - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь вставить данные из объекта в мою таблицу базы данных sqlite.Я продолжаю получать ту же ошибку при попытке сделать это.

При вставке данных в другую таблицу (слова) одного и того же БД, используя ту же технику, я могу успешно вставить данные без ошибок.Это заставляет меня поверить, что мое значение SQLiteConnection 'cnn' не является проблемой.Я убедился, что имена свойств объекта такие же, как и поля в таблице.В этой конкретной таблице нет первичного ключа, но я не уверен, является ли это проблемой или нет.

Код, который не работает:

using (IDbConnection cnn = new SQLiteConnection(connection))
{
     foreach (bridgeRecord br in bridgeWords)
            {
                try
                {
                    cnn.Execute("insert into bridge (engWord, spaWord, frequency, wordClass) values (@engWord, @spaWord, @frequency, @wordClass)", br);
                }
                catch (SQLiteException ex)
                {
                    Console.WriteLine(ex);
                }
            }
}

Код, который работает:

using (IDbConnection cnn = new SQLiteConnection(connection))
{
            foreach (Word w in words)
            {
                try
                {
                    cnn.Execute("insert into words (word, wordSimplified, confidence, difficulty, wordClass, wordCategory, dateTestedLast, popularity, language) " +
                    "values (@word, @wordSimplified, @confidence, @difficulty, @wordClass, @wordCategory, @dateTestedLast, @popularity, @language)", w);
                }
                catch (SQLiteException ex)
                {
                    wordsBouncedBack.Add(w.word);
                    continue;
                }
            }
}

Модель класса 'bridgeRecord' выглядит следующим образом:

    class bridgeRecord
{
    public string engWord;
    public string spaWord;
    public int frequency;
    public string wordClass;
}

Это ошибка, которую я получаю:

code = Unknown (-1), message = System.Data.SQLite.SQLiteException (0x80004005): unknown error
Insufficient parameters supplied to the command
at System.Data.SQLite.SQLiteStatement.BindParameter(Int32 index, SQLiteParameter param)

Я ожидал 'bridgeRecord'объект, чтобы предоставить параметры для вставки, но это не так.Хотя объект «Word», кажется, обеспечивает параметры очень хорошо, что меня очень смущает.

Любая помощь будет принята с благодарностью.Это мой первый вопрос о переполнении стека, поэтому я прошу прощения, если ответ очень очевиден:)

1 Ответ

0 голосов
/ 22 января 2019

Следуя советам Паскаля в комментариях, я использовал метод command.parameters.add, чтобы исправить мою проблему.Я подготовил отчет заранее, а затем добавил параметры на правильное место.Окончательный код теперь выглядит следующим образом:

SQLiteCommand command = new SQLiteCommand("insert into bridge (id, engWord, spaWord, frequency, wordClass) values (@id, @engWord, @spaWord, @frequency, @wordClass)",cnn);

                    command.Parameters.AddWithValue("@id", br.engWord + br.spaWord + br.frequency + br.wordClass);
                    command.Parameters.AddWithValue("@engWord", br.engWord);
                    command.Parameters.AddWithValue("@spaWord", br.spaWord);
                    command.Parameters.AddWithValue("@frequency", br.frequency);
                    command.Parameters.AddWithValue("@wordClass", br.wordClass);

                    command.ExecuteNonQuery();

Было бы лучше найти исправление, которое позволило бы коду работать так же, как и другой оператор INSERT, но этого обходного пути будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...