【问题标题】:Undefined function call lower()未定义的函数调用lower()
【发布时间】:2013-02-14 19:10:54
【问题描述】:

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

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

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

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

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

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

select语句是:

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

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

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

【问题讨论】:

  • 如果您发现某个答案对您有用,请记住“接受”它以供未来访问者使用。

标签: vb.net sqlite dataset typed


【解决方案1】:

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

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

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

更多信息请参见DataView RowFilter Syntax [C#]

【讨论】:

  • 所以 WHERE 子句永远不会发送到 SQLite...嗯...所以我需要调整 TableAdapter 使其始终以小写形式返回文件名,因为这将由 SQLite 执行对吗?
  • 这对我来说似乎是一个不错的策略,但显然你是唯一可以访问代码的人。 (见更新)
  • 所以遇到了我的第一个问题。在您发出.Update() 之前,一切似乎都工作正常。由于适配器中的Lower(FileName) As [FileName],自动创建的 INSERT 语句不会将 FileName 保存回表中。我需要弄清楚如何为 INSERT 编写自定义查询。
  • 所以我现在使用 VS2012 中的向导创建了自定义 INSERT 和 UPDATE 查询,并使用了默认名称 InsertQuery 和 UpdateQuery。当向导生成我的 UPDATE 和 INSERT 查询时,它无法读取 Lower() 调用中使用的列名,因此我手动添加了列名。我得到的错误意味着由于列上的 NOT NULL 没有传递 FileName。我需要在任何地方定义@Parameters,还是应该为查询/表格适配器自动生成这些?
【解决方案2】:

The statement works as expected in SQLiteAdmin.

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

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

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

【讨论】:

  • lower(FileName) 由 SQLite 处理。使用 EscapeFileName(strFileName).ToLower() 的结果。任何地方都没有调用客户端函数:"lower(FileName) = 'this-is-in-lower-case.txt'"
  • @Tim 你是对的,但除非你已经知道问题出在哪里,否则你的答案非常令人困惑。您可能想通过解释差异等来进行修改。为实际问题提供解决方案也很有帮助。
  • @Cyborgx37:会的。添加了一个 P.S.有解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2015-02-11
  • 2016-11-12
  • 2013-02-26
  • 2011-02-24
相关资源
最近更新 更多