1

我的 sqlite 查询中出现以下异常:

表达式包含未定义的函数调用 lower()

我在 VS2012 中有一个非常简单的 SQLite 类型数据集。

我正在解析大量数据,并想在添加新行之前检查一行是否已经存在。

我正在使用该.select()方法返回一个数据行数组。如果数组的长度为零,我添加一个新的。简单的!

一切运行良好,但我添加了一个检查以防止在大小写错误时添加重复行。我正在存储文件名。

选择语句是:

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

但是,我在lower(FileName)上收到上述错误。如果我删除它可以正常工作,但显然检查不具有可比性。

该语句在 SQLiteAdmin 中按预期工作。

4

2 回答 2

3

如果我理解正确,您有一个 .NET DataTable(查询的结果)并且您正在调用DataTable.Select(string)传入 where 子句。

这个 where 子句由 .NET 处理,而不是由 SQLite 处理(正如 Tim 所指出的那样)。您不能在 DataTable 的 Select 函数中使用 SQLite(或任何其他 DBMS)函数。您可以使用以下功能:

  • CONVERT – 将特定表达式转换为指定的 .NET Framework 类型
  • LEN – 获取字符串的长度
  • ISNULL – 检查表达式并返回检查的表达式或替换值
  • IIF – 根据逻辑表达式的结果获取两个值之一
  • TRIM – 删除所有前导和尾随空白字符,如 \r、\n、\t、‚ '</li>
  • SUBSTRING – 获取指定长度的子字符串,从字符串中的指定点开始

有关详细信息,请参阅DataView RowFilter 语法 [C#]

于 2013-02-28T15:00:51.870 回答
1

The statement works as expected in SQLiteAdmin.

客户端数据对象不调用服务器端函数,而是调用客户端函数。

编辑: PS DataTable 有一个CaseSensitive选项,可以设置为 false。

PPS 一旦您在 .NET 数据对象中获得记录集(即您的选择已被执行并且行集已被检索),数据对象的内置方法(选择、查找等)对数据的任何进一步过滤都是对本地、客户端断开的数据进行操作;与数据库的“对话”没有进行。这些客户端方法不是“将指令传递”到数据库。阅读断开连接的记录集模型。

于 2013-02-28T14:43:56.010 回答