[转载红鱼儿]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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值