使用FireDAC的TFDQuery查詢Firebird遇到的坑

這幾天被「Prepare」這個東西搞死了,雖然用它解決了目前的問題,可是徹底不知道爲何,若有大俠知道還望指教,不勝感激!數據庫

首先,說下開發環境:app

win10 x64(1709 [10.0.16299.125]) + Delphi XE7 up1(自帶FireDAC) + Firebird 3.0.2.32703_0(數據庫字符集使用UTF8)code

  • 問題一:中文模糊查詢
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;

雖然兩個問題目前都解決了,並且能夠很好的正常運行,可是徹底不知道爲何,尤爲是問題二。ci


最近又遇到了另外一種相似的問題,不過規律好像也發現了,就是:參數有中文字段的話,必須使用Prepare才能正常查詢到結果,並且Prepare必須在中文字段參數以前開發

相關文章
相關標籤/搜索