未定义的函数调用lower()

时间:2013-02-28 14:36:48

标签: vb.net sqlite dataset typed

我在sqlite查询中遇到以下异常:

  

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

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

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

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

一切都运行良好,但我添加了一项检查,以防止在案例错误时添加重复行。我正在存储文件名。

select语句是:

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

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

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

2 个答案:

答案 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模型。