我在sqlite查询中遇到以下异常:
表达式包含未定义的函数调用lower()
我在VS2012中有一个非常简单的SQLite类型数据集。
我正在解析大量数据,并希望在添加新行之前检查某行是否已存在。
我正在使用.select()
方法返回数据行数组。如果数组的长度为零,我添加一个新的。简单!
一切都运行良好,但我添加了一项检查,以防止在案例错误时添加重复行。我正在存储文件名。
select语句是:
"lower(FileName) = '" + EscapeFileName(strFileName).ToLower() + "'"
但是我在 lower(FileName)上遇到上述错误。如果我删除这个工作正常,但显然检查不具有可比性。
该语句在SQLiteAdmin中按预期工作。
答案 0 :(得分:2)
如果我理解正确,你有一个.NET DataTable
(查询的结果),你正在调用DataTable.Select(string)
传入一个where子句。
这个where子句由.NET处理,而不是由SQLite处理(正如Tim指出的那样)。您不能在DataTable的Select函数中使用SQLite(或任何其他DBMS)函数。您可以使用以下功能:
- CONVERT - 将特定表达式转换为指定的.NET Framework类型
- LEN - 获取字符串的长度
- ISNULL - 检查表达式并返回已检查的表达式或替换值
- IIF - 根据逻辑表达式的结果获取两个值中的一个
- TRIM - 删除所有前导和尾随空白字符,例如\ r,\ n,\ t,\ t,
- SUBSTRING - 从字符串中的指定点开始获取指定长度的子字符串
有关详细信息,请参阅DataView RowFilter Syntax [C#]。
答案 1 :(得分:1)
The statement works as expected in SQLiteAdmin.
客户端数据对象不调用服务器端函数,而是调用客户端函数。
编辑:P.S。 DataTable有一个CaseSensitive选项,可以设置为false。
P.P.S。一旦在.NET数据对象中有了记录集(即已经执行了select并且已经检索了行集),数据对象的内置方法(select,find等)的任何进一步数据过滤都在运行在本地客户端断开连接的数据;与数据库的“对话”没有进行。这些客户端方法不是“将指令传递”到数据库。阅读Disconnected Recordset模型。