zoukankan      html  css  js  c++  java
  • [转载红鱼儿]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;
  • 相关阅读:
    Server2012R2 ADFS3.0 The same client browser session has made '6' requests in the last '13'seconds
    pig的grunt中shell命令不稳定,能不用尽量不用
    pig脚本的参数传入,多个参数传入
    pig的cogroup详解
    pig的limit无效(返回所有记录)sample有效
    Dynamics CRM2013 任务列表添加自定义按钮
    简述浏览器渲染机制
    如何区分浏览器类型
    使用mock.js生成前端测试数据
    理解Ajax
  • 原文地址:https://www.cnblogs.com/xalion/p/2765819.html
Copyright © 2011-2022 走看看