[转载红鱼儿]kbmmw 开发点滴:kbmMWQuery插入记录-阿里云开发者社区

开发者社区> 数据库> 正文

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

简介: 想利用TkbmMWUNIDACQuery插入一条记录,结果遇到问题,显示: 不允许从数据类型 sql_variant 到 varchar 的隐式转换。请使用 CONVERT 函数来运行此查询。这是什么问题啊?下面是出问题的代码,很常规的写法。

想利用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;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章