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的参数及其值。