即时通讯使用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中返回零行...
好吗?
谢谢
在常规SQL中,星号字符不是通配符.表示"匹配任何内容"的通配符是百分号,%
.Unidac提供"服务器独立的SQL",这可能意味着它需要你提供的SQL,它应该是Unidac认可的方言,并将其转换为你所定位的数据库的方言,所以你写的SQL需要对Unidac有效,不一定对您的实际目标数据库有效.Unidac将处理翻译.如果有的话,Unidac可能会使用你的星号并转义它们,以便目标数据库最终收到对包含实际星号的字段的请求.
一种自己决定这种方法的方法首先是削减你的SQL,直到它确实返回一些东西.然后,您可以逐步重新添加所需查询的片段,直到它再次开始失败,此时您已确定您的程序遇到问题的SQL.
您可能还希望考虑将日期存储为日期字段,而不是将它们存储为西班牙文本.它会大大简化您的查询.
另外,请注意cboAnio.Text
直接合并到您的查询中.它可能会提供SQL注入漏洞.为避免这种情况,请使用参数化查询.