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