1

我正在使用 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 中返回零行...

有什么想法吗?

谢谢

4

1 回答 1

5

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


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

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

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

于 2013-01-11T16:24:06.313 回答