[红鱼儿]kbmmw 开发点滴:kbmMWQuery插入记录

想利用TkbmMWUNIDACQuery插入一条记录,结果遇到问题,显示:

不允许从数据类型 sql_variant 到 varchar 的隐式转换。请使用 CONVERT 函数来运行此查询。
这是什么问题啊?下面是出问题的代码,很常规的写法。

    q:= TkbmMWUNIDACQuery.Create(self);
    try
      q.ConnectionPool:=self.kbmMWUNIDACConnectionPool1;
      q.SessionName:=Self.kbmMWPooledSession1.SessionName;
      q.SQL.Text:= 'Insert into t (MaxSn) values (:MaxSn)';
      q.Params.ParamByName('Maxsn').AsString:='222';
      q.ExecSQL;//出错: 不允许从数据类型 sql_variant 到 varchar 的隐式转换。请使用 CONVERT 函数来运行此查询。
    finally
      q.Free;
    end;

最后发现,问题出在uniDAC上:
在这个方法中,procedure TkbmMWCustomUNIDACQuery.PerformExecute;是使用TuniSQL执行的SQL,在执行前,调用了uniSQL.Prepare方法,注释掉,就没有问题了。

uniDAC怎么会这样呢?

通过这个错误,到是让我仔细读了TkbmUNIDACQuery的ExecSQL方法的实现过程,说出来很简单:
为kbmUNIDACQuery做好sql语句及设置好参数后,在调用ExecSQL时,kbmUNIDACQuery在重载的方法PerformExecute中实现数据库操作。

看下这个方法,就是用一个TuniSQL对象,并把自己的SQL语句及参数传递给他,由他来执行具体的数据库操作。
 

       q:=TUniSQL.Create(nil);//建立uniSQL对象
        try
           SetSpecificOptions(q.SpecificOptions);//设置附加的参数
           q.Connection := c.Database;//使用kbmUNIDACQuery的数据库联接,即uniConnection
           q.SQL.Assign(CookedQuery);//设置执行的SQL
           //q.Prepare; //Prepare语句,就是这句闹病!需要注释掉
           UniDACCopyInputParamsValueAndType(Params,q.Params,
             Connection.ConnectionPool.MetaData.UnicodeOptions);//设置参数,把uniDACQuery的参数,传递给内部执行数据库操作Q对象的参数
           q.Execute;

你可能感兴趣的:(query)