Добавление параметров в SQLite с помощью C#

Я только изучаю SQLite, и я не могу правильно скомпилировать свои параметры в команду. Когда я выполняю следующий код:

this.command.CommandText = "INSERT INTO [StringData] VALUE (?,?)";

this.data = new SQLiteParameter();
this.byteIndex = new SQLiteParameter();

this.command.Parameters.Add(this.data);
this.command.Parameters.Add(this.byteIndex);

this.data.Value = data.Data;
this.byteIndex.Value = data.ByteIndex;

this.command.ExecuteNonQuery();

Я получаю исключение SQLite. Изучив CommandText, я обнаружил, что все, что я делаю, неправильно добавляет параметры: INSERT INTO [StringData] VALUE (?,?)

Любые идеи, что мне не хватает?

Спасибо


person Brian Sweeney    schedule 30.04.2009    source источник
comment
Можете ли вы опубликовать исключение, которое вы получаете?   -  person JP Alioto    schedule 01.05.2009
comment
А также полный код?   -  person Xbox One    schedule 20.08.2020


Ответы (2)


Попробуйте VALUES вместо VALUE.

person Community    schedule 30.04.2009

Попробуйте другой подход, назвав свои поля в запросе и назвав параметры в запросе:

this.command.CommandText = "INSERT INTO StringData (field1, field2) VALUES(@param1, @param2)";
this.command.CommandType = CommandType.Text;
this.command.Parameters.Add(new SQLiteParameter("@param1", data.Data));
this.command.Parameters.Add(new SQLiteParameter("@param2", data.ByteIndex));
...
person Björn    schedule 30.04.2009
comment
Теперь вы можете сделать это: this.command.Parameters.AddWithValue("@param1", data.Data); this.command.Parameters.AddWithValue("@param2", data.ByteIndex); - person skst; 20.04.2017
comment
@skst Пожалуйста, не используйте .AddWithValue. См. dbdelta.com/addwithvalue-is-evil и blogs.msmvps.com/jcoehoorn/blog/2014 /05/12/ и еще один: dba.stackexchange.com/questions/195937/ - person Mary; 22.08.2019
comment
@VinGarcia .CommandType помогает базе данных определить, является ли это текстовой командой или именем хранимой процедуры. Это избавляет базу данных от необходимости анализировать команду. - person Mary; 22.08.2019
comment
@Mary, вы делаете правильное замечание, но, честно говоря, SQLite имеет лишь небольшое подмножество типов, предоставляемых SQL Server, поэтому вероятность несоответствия гораздо меньше. Реализация SQLite AddWithValue() должна выбирать только между NULL, REAL, INTEGER, TEXT и BLOB . Я предполагаю, что он может выбрать INTEGER вместо REAL, но это, вероятно, будет обнаружено довольно быстро. Все же да, наверное лучше использовать Add() и указать тип. Что касается указания CommandType, Text является типом по умолчанию, поэтому его не нужно устанавливать. (В SQLite нет хранимых процедур.) - person skst; 24.08.2019
comment
@skst Re: CommandType Я просто пытался ответить на вопрос VinGarcia в комментариях. Ваш комментарий о значении по умолчанию как .Text завершает ответ. Спасибо. Хорошая мысль об ограниченных типах в Sqlite, но я думаю, что буду придерживаться .Add. Это то, к чему я привык. :-) - person Mary; 24.08.2019
comment
Согласованный. Я мог бы вернуться и изменить свои вызовы AddWithValue() на Add(), так как я предпочитаю сильные типы. :-) Я видел, что вы отвечаете на вопрос VinGarcia, но я подумал, что было бы полезно указать, что это не требуется, потому что в SQLite нет выбора, кроме Text (по крайней мере, на данный момент). - person skst; 24.08.2019
comment
@Mary не используйте AddWithValue, поскольку следует избегать общего совета. Избегайте использования AddWithValue, если ваша БД лучше SQL Server; MySQL активно пропагандирует и продвигает его использование, например - person Caius Jard; 18.08.2020
comment
@CaiusJard Я вижу, что ваша ссылка специально нацелена на MySqlConnector. Я использую MySql.Data.MySqlClient. Я спросил, относится ли отказ от использования .Add() только к MySqlConnector или к обоим провайдерам в нескольких местах, но так и не получил ответа. Я надеюсь, что вы можете пролить свет на это и дать мне ссылку. Спасибо. - person Mary; 08.02.2021