红鱼儿

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

 

 

 

 

 

posted on 2018-12-21 22:21  红鱼儿  阅读(752)  评论(0编辑  收藏  举报