2009-03-21 2 views
0

Я использую Sqlite в качестве моей базы данных по выбору в приложении форм C#, с http://sqlite.phxsoftware.com/ поставщиком System.Data.SQLite. Я пытаюсь реализовать функцию поиска, но она не играет хорошо ... или я чего-то не хватает.System.Data.Sqlite FormatException с использованием параметра с LIKE

Упрощенный SQL Я использую выглядит следующим образом:

SELECT * 
FROM Table 
WHERE column LIKE @boundParameter ESCAPE '!' 

Когда я запускаю это, в любой подстановке с параметром (с использованием или 001 или:? BoundParameter или @boundParameter), это дает мне formatException: «Строка ввода не была в правильном формате». Я не смог найти ничего, что говорит, что я не могу использовать параметры с LIKE. Кто-нибудь знает об этом? Нужно ли мне делать это по-другому?

+0

Я не могу редактировать вопросы Да, так, пожалуйста, отредактируйте свой вопрос и включите, что это с поставщиком phxsoftware. – Noah

ответ

0

Как вы подключаете и добавляете параметры?

Я не использовал 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)); 
... 
0

«Входная строка не была в правильном формате» не сообщение об ошибке, возвращаемое любой версии SQLite

Он должен быть возвращается в обертке. SO ... Я собираюсь предположить, что вы используете поставщика ADO.NET 2.0 от sqlite.phxsoftware.com

Не забудьте указать значение, которое вы связываете с параметром.

Например, если вы используете

command.Parameters.Add(new SQLiteParameter("@boundParameter", _pattern)); 

затем _pattern = " 'тест'" и не "тест"

+0

Это неверно, см. Http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx для получения дополнительной информации. «В отличие от текста команды ввод параметров рассматривается как буквальное значение, а не как исполняемый код». Параметры не обязательно должны быть экранированы вручную, так как они обрабатываются буквально. –

+0

Похоже, я ошибаюсь, но я думал, что это проблема с тем, как поставщик System.Data.SQLite из phxsoftware передавал связанные параметры SQLite. – Noah

+0

Я действительно использую http://sqlite.phxsoftware.com/ поставщик System.Data.SQLite. Я тестировал один и тот же SQL по-другому, и он, похоже, работал ... возможно, ошибка у провайдера. – cofiem

2

Я рекомендовал бы попробовать что-то вроде этого:

"SELECT * FROM [Table] WHERE [column] LIKE @boundParameter ESCAPE @escape"; 

и затем:

command.Parameters.AddWithValue("@boundParameter", parameter)); 
command.Parameters.AddWithValue("@escape", "!"); 

Parameters.AddWithValue - это способ SQLite добавления связанного параметра, вместо того, чтобы каждый раз объявлять новый.

@Noah (извините, не могу пока комментировать)

Стивен Дженнингс прав, вы не должны процитировать значение, являются обязательными.

+0

Похоже, я ошибаюсь, но я думал, что это проблема с тем, как поставщик System.Data.SQLite из phxsoftware передавал связанные параметры SQLite. – Noah

+0

интересная идея, я дам это. – cofiem

0

Этот программный код выполняет запрос, включающий в себя ПАРАМЕТРНОЕ ЗАМЕЩЕНИЕ и УСТАНОВКУ ПОДГОТОВКИ за один шаг. Здесь строковая переменная myNamePattern - это строка, которую мы хотим найти для клиентов, так что все возвращенные клиенты будут ВКЛЮЧАТЬ переменную myNameattern. У меня была та же проблема, но я решил это! Это идеальный способ заменить шаблон строки (то есть также параметр) на SQLiteCommand.CommandText:

SQLiteCommand command = conn.CreateCommand(); command.CommandText = "select * from Customer, где имя типа @myStringParameter"; command.Parameters.Add ("myStringParameter", System.Data.DbType.String) .Value = "%" + myNamePattern + "%";