2013-02-28 141 views
1

我收到以下异常在我的SQLite查询:未定义的函数调用低()

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

我有输入一个非常简单的SQLite数据集在VS2012。

我解析了大量的数据,并希望在添加新行之前检查一行是否已经存在。我使用.select()方法返回一个数组行。如果数组的长度为零,我添加一个新的。简单!

所有工作都很好,但我添加了一个检查来防止重复的行被添加,如果案件是错误的。我正在存储文件名。

select语句是:

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

但是我上下(文件名)上述错误。如果我删除这是工作正常,但显然检查是不可比较的。

该声明在SQLiteAdmin中按预期工作。

+0

如果您发现某个答案适合您,请记住为了未来的访问者“接受”它。 – JDB 2013-02-28 15:54:08

回答

2

如果我理解正确,你有一个.NET DataTable(查询的结果),你打电话给DataTable.Select(string)传递一个where子句。

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

  • CONVERT - 特定表达式转换为指定的。.NET框架类型
  • LEN - 获取一个字符串的长度
  • ISNULL - 检查的表达,要么返回检查表达或一个替换值
  • IIF - 根据两个值中的一个得到逻辑表达式
  • TRIM的结果 - 删除所有的前缘和后空白字符,如\ r \ N,\吨,“
  • SUBSTRING - 得到了指定长度的子串,字符串

更多信息请参见DataView RowFilter Syntax [C#]在起始于一个指定点。

+0

所以WHERE子句永远不会发送到SQLite ...嗯...所以我需要调整TableAdapter,因此它总是以小写形式返回文件名,因为这将由SQLite正确执行? – Corneloues 2013-02-28 15:02:25

+0

这对我来说似乎是一个很好的策略,但显然你是唯一能够访问代码的人。 (见更新) – JDB 2013-02-28 15:04:20

+0

所以打我的第一个问题。在您发出'.Update()'之前,所有程序都可以正常工作。由于适配器中的'Lower(FileName)As [FileName]',自动创建的** INSERT **语句不会将FileName保存回表中。我需要弄清楚如何为** INSERT **编写自定义查询。 – Corneloues 2013-02-28 23:11:35

1

The statement works as expected in SQLiteAdmin.

该客户端的数据的对象不调用服务器侧的功能,但客户端功能。

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

P.P.S.在.NET数据对象中有一组记录(即,您的选择已被执行并且行集已被检索到)之后,数据对象的内置方法(select,find等)进一步过滤数据,在本地,客户端断开连接数据;与数据库的“对话”尚未进行。这些客户端方法不是“将指令传递给”数据库。阅读Disconnected Recordset模型。

+0

较低(FileName)由SQLite处理。使用EscapeFileName(strFileName).ToLower()的结果。有没有客户端函数调用的任何地方: '“下(文件名)=‘这 - 是 - 在 - 低级case.txt’”' – Corneloues 2013-02-28 14:57:09

+0

@Tim你是正确的,但你的回答是,除非你极其混乱已经知道问题是什么。您可能希望通过解释差异等来进行修改。为实际问题提供解决方案也是有帮助的。 – JDB 2013-02-28 15:06:26

+0

@ Cyborgx37:会做的。增加了一个P.S.与解决方案。 – Tim 2013-02-28 15:09:26