System.Data.Sqlite FormatException с использованием параметра с LIKE
Я использую Sqlite в качестве своей базы данных в приложении на C# формах с поставщиком http://sqlite.phxsoftware.com/ System.Data.SQLite. Я пытаюсь реализовать функцию поиска, но она не играет хорошо... или я что-то упускаю.
Упрощенный sql, который я использую, выглядит следующим образом:
SELECT *
FROM Table
WHERE column LIKE @boundParameter ESCAPE '!'
Когда я запускаю это в любой перестановке с параметром (используя? Или?001 или:boundParameter или @boundParameter), он дает мне исключение FormatException: "Входная строка была не в правильном формате". Я не смог найти ничего, что говорит, что я не могу использовать параметры с LIKE. Кто-нибудь знает что-нибудь об этом? Мне нужно сделать это как-нибудь по-другому?
4 ответа
Я бы порекомендовал попробовать что-то вроде этого:
"SELECT * FROM [Table] WHERE [column] LIKE @boundParameter ESCAPE @escape";
а потом:
command.Parameters.AddWithValue("@boundParameter", parameter));
command.Parameters.AddWithValue("@escape", "!");
Parameters.AddWithValue - это способ добавления связанного параметра в SQLite вместо необходимости каждый раз объявлять новый.
@ Нет (извините, пока не могу комментировать)
Стивен Дженнингс прав, вам не нужно указывать значение, которое вы связываете.
Этот программный код выполняет запрос, который включает ЗАМЕНУ ПАРАМЕТРОВ и ФИТИНГ ШАБЛОНА за один шаг. Здесь строковая переменная myNamePattern - это строка, для которой мы хотим найти клиентов, чтобы все возвращенные клиенты включали переменную myNameattern string. У меня была такая же проблема, но я решил ее! Это идеальный способ замены строкового шаблона (который также является параметром) в SQLiteCommand.CommandText:
SQLiteCommand command = conn.CreateCommand (); command.CommandText = "выберите * из клиента, где имя, как @myStringParameter"; command.Parameters.Add("myStringParameter", System.Data.DbType.String).Value = "%"+ myNamePattern+ "%";
"Входная строка была не в правильном формате" не является сообщением об ошибке, возвращаемым любой версией SQLite
Он должен быть возвращен упаковщиком. ТАК... Я собираюсь догадаться, что вы используете провайдер ADO.NET 2.0 с sqlite.phxsoftware.com
Не забудьте указать значение, которое вы привязываете к параметру.
Например, если вы используете
command.Parameters.Add(new SQLiteParameter("@boundParameter", _pattern));
тогда _pattern = "'тест'", а не "тест"
Как вы подключаете и добавляете параметры?
Я не очень много использовал SQLite, но следующее должно работать;
SQLiteCommand command = _yourConnection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = "SELECT * FROM Table WHERE column LIKE @boundParameter";
command.Parameters.Add(new SQLiteParameter("@boundParameter", _yourSearchCriteria));
...