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;
  • 相关阅读:
    树形结构菜单,递归实现
    基于Vue的日历组件,可以标注重要日子
    关于element-ui级联菜单(城市三级联动菜单)和回显问题
    继承(面试问到)
    vue监听浏览器刷新
    Popover 弹出框,里面的表格点击后关闭弹窗
    el-table表格合并单元格
    对角线
    ElementUI中el-radio再次点击取消选中
    保留文本框换行和空格
  • 原文地址:https://www.cnblogs.com/xalion/p/2765819.html
Copyright © 2011-2022 走看看