【问题标题】:DELPHI / ACCESS SELECT SQL ERROR德尔福/访问选择 SQL 错误
【发布时间】:2013-01-11 15:38:33
【问题描述】:

我正在使用 UNIDAC TUniQuery 组件,这是我的 sql:

q_ContribSem2.Close;
q_ContribSem2.SQL.Clear;
q_ContribSem2.SQL.Add('SELECT SUMINISTRO.SUMTITIPOPERSONA, SUMINISTRO.SUMCHRAZONSOCIAL, SUMINISTRO.SUMCHAPELLIDOPATERNO,');
q_ContribSem2.SQL.Add('SUMINISTRO.SUMCHAPELLIDOMATERNO, SUMINISTRO.SUMCHNOMBRES, SUMINISTRO.SUMchCodigo, SUMINISTRO.SUMTITIPOCALLE, ');
q_ContribSem2.SQL.Add('SUMINISTRO.SUMCHNOMBRECALLE, SUMINISTRO.SUMCHNUMEROCALLE, SUMINISTRO.OBSERVACIONESMEDIDOR ');
q_ContribSem2.SQL.Add('FROM SUMINISTRO ');
q_ContribSem2.SQL.Add('WHERE ((((SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + 'NVO*' + chr(39) + ' Or ');
q_ContribSem2.SQL.Add('(SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + 'NUEVO*' + chr(39) + ') And');
q_ContribSem2.SQL.Add('((SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*JULIO*' + chr(39) + ' Or ');
q_ContribSem2.SQL.Add(' (SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*AGOSTO*' + chr(39) + ' Or ');
q_ContribSem2.SQL.Add(' (SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*SETIEMBRE*' + chr(39) + ' Or ');
q_ContribSem2.SQL.Add(' (SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*OCTUBRE*' + chr(39) + ' Or ');
q_ContribSem2.SQL.Add(' (SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*NOVIEMBRE*' + chr(39) + ' Or ');
q_ContribSem2.SQL.Add(' (SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*DICIEMBRE*' + chr(39) + ') And ');
q_ContribSem2.SQL.Add(' (SUMINISTRO.OBSERVACIONESMEDIDOR) Like ' + chr(39) + '*' + cboAnio.Text + '*' + chr(39) + '));');
q_ContribSem2.Open;

此语句在 ACCESS 中返回行,但在 Delphi 中返回零行...

有什么想法吗?

谢谢

【问题讨论】:

  • 你试过他们的支持吗?他们通常反应灵敏。 forums.devart.com
  • SUMINISTRO.OBSERVACIONESMEDIDOR 的表列类型是什么?是字符串还是日期? “尝试访问”是什么意思?您的数据库在 Ms Access 中?或者你使用一些未命名的 SQL 服务器并且你使用 Access 从该服务器读取数据?
  • SUMINISTRO.OBSERVACIONESMEDIDOR 是文本 (50) 如果您想将您的电子邮件发送给我以附加项目 ;)
  • 是的,我使用的是 MS Access 2010
  • 你考虑过使用 TAccessApplication 吗?标准 SQL 也需要百分号而不是星号来扩展字符串。 msdn.microsoft.com/en-us/library/ms179859.aspx 但我认为你最好寻求他们的支持,并将 cboAnio.Text 移动到查询参数中

标签: sql delphi ms-access ms-access-2010 unidac


【解决方案1】:

在常规 SQL 中,星号字符不是通配符。表示“匹配任何内容”的通配符是百分号%。 Unidac 提供“独立于服务器的 SQL”,这可能意味着它采用您提供给它的 SQL,该 SQL 应该是 Unidac 可识别的方言,并将其转换为您正在使用的数据库的方言目标,因此您编写的 SQL 需要对 Unidac 有效,不一定对您的实际目标数据库有效。 Unidac 将处理翻译。如果有的话,Unidac 可能会使用您的星号并将它们转义,以便目标数据库最终收到对其中包含实际星号的字段的请求。


您自己确定这一点的一种方法是首先削减您的 SQL,直到它确实返回一些东西。然后,您可以逐渐重新添加所需查询的片段,直到它再次开始失败,此时您已经确定了您的程序遇到了哪些 SQL 问题。

您可能还希望考虑将日期存储为 date 字段,而不是将它们存储为西班牙语 text。这将大大简化您的查询。

另外,请注意不要将cboAnio.Text 直接合并到您的查询中。它可能会提供 SQL 注入 漏洞。为避免这种情况,请使用参数化查询。

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多