1. 程式人生 > >Unknown parameter datatype UNKNOW send from server.

Unknown parameter datatype UNKNOW send from server.

procedure Tmainform.Button7Click(Sender: TObject);
begin

  kbmMWClientQuery3.Query.Text:='insert into t1 (fid,fname,fint,fint64) values (:id,:name,:int,:int64)';

  //kbmMWClientQuery3.Params.ParamByName('id').DataType:=ftString;
  //kbmMWClientQuery3.ParamByName['id'].DataType:=ftString;
  //kbmMWClientQuery3.ParamByName['id'].Size:=200;
kbmMWClientQuery3.ParamByName['id'].Value:='2000'; kbmMWClientQuery3.ParamByName['name'].Value:='2000'; kbmMWClientQuery3.ParamByName['int'].Value:=1; //kbmMWClientQuery3.ParamByName['int64'].Value:=11111111; kbmmwclientQuery3.Execute; end;

看上面的程式碼,利用ClientQuery執行一條Insert語句,向資料庫插入一條記錄。如果不為int64

引數賦值,則在執行Execute時,產生異常:Unknown parameter datatype (UNKNOW) send from server,同時,記錄也插入到資料庫中了。如果換用Resolve提交資料,則不會產生異常。

通過跟蹤分析Execute方法,原來,正如這個異常資訊所示,就是執行SQL時,從應用伺服器返回了UNKNOW引數型別,即未知引數型別,而在客戶端的PerformExecute方法中,當向服務端發出請求並接收返回結果後,客戶端要根據服務端返回的結果,重建客戶端ClientQuery的引數及值,當發現有UNKONW引數時,會提出這個異常。

為避免這種情況,有兩種方法:一是換用Resolve可以解決;二是保證為所有的引數賦值。

我試著註釋掉PerformExecute中下面兩行程式碼:

             if ftype=ftUnknown then
                kbmMWRaiseException(KBMMW_ERR_CLIENT_DATASTORE_RESPONSE_UNKNOWNPARAMDATATYPE,'Unknown parameter datatype'+fstype+') send from server.');

不再提升異常,也能重建ClientQuery的引數及其值。