2013-02-28 4 views
1

Я получаю следующее исключение в моем запросе SQLite:вызов функции Неопределенный ниже()

Выражение содержит вызов функции не определено ниже()

У меня есть очень простой SQLite набранный набор данных в VS2012.

Я разбираю большой объем данных и хочу проверить, существует ли строка до добавления новой строки.

Я использую метод .select() для возврата массива datarows. Если длина массива равна нулю, я добавляю новое новое. Просто!

Все работает хорошо, но я добавил проверку, чтобы предотвратить добавление повторяющихся строк, если это неверно. Я храню имена файлов.

ЗЕЬЕСТ является:

"lower(FileName) = '" + EscapeFileName(strFileName).ToLower() + "'" 

Однако я получаю вышеуказанную ошибку на ниже (FileName). Если я удалю, это работает нормально, но, очевидно, проверка не сопоставима.

Заявление работает как ожидается в SQLiteAdmin.

+0

Если вы обнаружили, что ответ сработал для вас, пожалуйста, не забудьте «принять» его ради будущих посетителей. – JDB

ответ

2

Если я правильно понял, у вас есть .NET DataTable (результат запроса), и вы вызываете DataTable.Select(string), передавая предложение where.

Это предложение where, обрабатываемое .NET, а не SQLite (как указывает Тим). Вы не можете использовать функцию SQLite (или любую другую СУБД) в функции Select для DataTable. Вы можете использовать эти функции:

  • CONVERT - преобразует конкретное выражение в заданное.NET Framework типа
  • LEN - получает длину строки
  • ISNULL - проверяет выражение и возвращает либо проверенное выражение, либо значение замены
  • IIF - получает один из двух значений в зависимости от результатом логического выражения
  • TRIM - удаляет все начальные и конечные пустые символы, такие как \ г \ п, \ т, "
  • SUBSTRING - получает подстроку заданной длины, начиная с указанной точки в строке

Смотрите DataView RowFilter Syntax [C#] для получения дополнительной информации.

+0

Итак, предложение WHERE никогда не отправляется на SQLite ... Хм ... Мне нужно настроить TableAdapter так, чтобы он всегда возвращал имя файла в нижнем регистре, так как это будет выполнено SQLite правильно? – Corneloues

+0

Это казалось бы хорошей стратегией для меня, но, очевидно, вы единственный, у кого есть доступ к коду. (См. Обновление) – JDB

+0

Итак, я столкнулся с первой проблемой. Кажется, что все работает нормально, пока вы не выпустите '.Update()'. Из-за 'Lower (FileName) As [FileName]' в адаптере автоматически созданный ** INSERT ** оператор не сохраняет FileName обратно в таблицу. Мне нужно выяснить, как написать пользовательский запрос для ** INSERT **. – Corneloues

1

The statement works as expected in SQLiteAdmin.

Объект данных на стороне клиента не вызывает функцию на стороне сервера, но на стороне клиента функции.

EDIT: P.S. В DataTable есть опция CaseSensitive, которая может быть установлена ​​в значение false.

P.P.S. Когда у вас есть набор записей в объекте данных .NET (т. Е. Ваш выбор был выполнен и набор строк был получен), всякая дальнейшая фильтрация данных с помощью встроенных методов объекта данных (select, find и т. Д.) на локальной стороне клиента отключен данные; «беседа» с базой данных не продолжается. Эти методы на стороне клиента не «передают инструкцию через» в базу данных. Прочитайте модель Disconnected Recordset.

+0

Нижняя (FileName) обрабатывается SQLite. Используется результат EscapeFileName (strFileName) .ToLower(). Нет никакой клиентской функции, вызываемой где угодно: '' lower (FileName) = 'this-is-in-lower-case.txt' "' – Corneloues

+0

@Tim Вы правы, но ваш ответ очень запутан, если вы уже знать, в чем проблема. Вы можете пересмотреть, объяснив разницу и т. Д. Было бы также полезно предложить решение актуальной проблемы. – JDB

+0

@ Cyborgx37: сделаю. Добавлен P.S. с решением. – Tim

Смежные вопросы