使用FireDAC的TFDQuery查询Firebird遇到的坑
2018-01-03 00:00
288 查看
摘要: Prepare的用法完全搞不懂了
这几天被“Prepare”这个东西搞死了,虽然用它解决了目前的问题,但是完全不知道为什么,如有大侠知道还望指教,不胜感激!
首先,说下开发环境:
win10 x64(1709 [10.0.16299.125]) + Delphi XE7 up1(自带FireDAC) + Firebird 3.0.2.32703_0(数据库字符集使用UTF8)
问题一:中文模糊查询
问题二:RecordCount 和 Eof
虽然两个问题目前都解决了,而且可以很好的正常运行,但是完全不知道为什么,尤其是问题二。
这几天被“Prepare”这个东西搞死了,虽然用它解决了目前的问题,但是完全不知道为什么,如有大侠知道还望指教,不胜感激!
首先,说下开发环境:
win10 x64(1709 [10.0.16299.125]) + Delphi XE7 up1(自带FireDAC) + Firebird 3.0.2.32703_0(数据库字符集使用UTF8)
问题一:中文模糊查询
var CompanyType: Integer FDQuery1.Close; FDQuery1.SQL.Text := 'SELECT * FROM companyinfo ' + 'WHERE (tag = 0) AND (companytype = :companytype) AND ' + '((companyname LIKE :Text) OR (pym LIKE :Text))' + ' ORDER BY TIMES DESC'; //FDQuery1.Prepare; //写在这里会报错,提示如下,大致意思是: //数据库 companytype 字段是SmallInt类型,却赋了一个Integer类型的值 {--------------------------- [FireDAC][Phys][FB]-338. Param [COMPANYTYPE] type changed from [ftSmallInt] to [ftInteger]. Query must be reprepared. Possible reason: an assignment to a TFDParam.AsXXX property implicitly changed the parameter data type. Hint: use the TFDParam.Value or appropriate TFDParam.AsXXX property. --------------------------- } FDQuery1.ParamByName('companytype').AsInteger := CompanyType; FDQuery1.Prepare; //必须!而且只能在这里!否则不支持中文模糊查询 FDQuery1.ParamByName('Text').AsString := '%' + btnedtKeyWord.Text + '%'; FDQuery1.Open();
问题二:RecordCount 和 Eof
//这是有问题的 FDQuery1.SQL.Text := 'select TAG from truckinfo where (TAG in (0,1)) and (PLATENUM = :PlateNum)'; FDQuery1.Prepare; //必须!否则 RecordCount 始终为 0,而 Eof 始终为 True FDQuery1.ParamByName('PlateNum').AsString := PlateStr; FDQuery1.Open; if FDQuery1.RecordCount > 0 then //或者是 if not FDQuery1.Eof then begin ... end; //--------------------------------------------------------------------- //但是在其它地方都是正常的 //例1 FDQuery1.SQL.Text := 'SELECT * FROM clientinfo WHERE (tag = 0) AND (id = :id)'; FDQuery1.ParamByName('id').AsInteger := AID; FDQuery1.Open(); if FDQuery1.Eof then begin ... end; //例2 FDQuery1.SQL.Text := 'SELECT * FROM employee WHERE tag <= 0 ORDER BY id'; FDQuery1.Open(); while not FDQuery1.Eof do begin ... end;
虽然两个问题目前都解决了,而且可以很好的正常运行,但是完全不知道为什么,尤其是问题二。
相关文章推荐
- 使用 FireDAC的 TFDConnection, TFDQuery 最初只能显示50条记录,TDateSet.RecordCount总是获得50的解决方法。
- 使用JSTL的sql:query标签制作分页查询遇到NoSuchFieldError: deferredExpression
- 使用hibernate3的createSQLQuery遇到的问题
- 使用mybatis遇到的关于条件查询">"以及if test传参的使用问题
- pt-query-digest查询日志分析工具 - percona-toolkit使用教程之系统类工具
- Hive中LIKE查询使用通配符'%'的一个BUG--当转义符'\'遇到通配符'%'或'_'
- Android异步查询框架AsyncQueryHandler使用简介
- 在使用mybatis时遇到查询结果返回为空的情况,但是查数据库能查到
- 慢查询与pt-query-digest使用
- ArcGIS API for Javascript 使用缓冲区结果做query查询出现“esri.config.defaults.io.proxyUrl 尚未进行设置”错误
- 如何解决PHP使用mysql_query查询超大结果集超内存问题
- 在ORM框架中使用原生sql语句进行聚合查询遇到的问题
- 使用ADF-BC 实现查询功能之十:重写prepareRowSetForQuery方法设置变量
- 使用UNION查询时,同时使用TOP 与ORDER BY遇到的问题
- 使用addScala将SQLQuery自定义查询映射到pojo中
- 使用Salesforce Object Query Language (SOQL)查询用户访问权限
- ElasticSearch各种查询对象Query的使用
- 关于SubSonic3.0插件使用SubSonic.Query.Select查询时,字段类型为tinyint时列丢失问题的Bug修复
- web.py 0.3 新手指南 - 使用db.query进行高级数据库查询
- SQVI和SAP查询QUERY的区别和使用注意事项