delphi – dbExpress的TSQLQuery可以使用吗?作为参数?
发布时间:2020-12-15 09:48:13 所属栏目:大数据 来源:网络整理
导读:我们将代码移植到Delphi XE2,并且需要将我们的数据访问组件从不再业务的第三方ODBCExpress更改为dbExpress的TSQLQuery. 我们有参数化的SQL查询,例如: sSQL := 'UPDATE ZTestData SET '+ ' StringField =?,'+ ' IntField = ?,'+ ' DecimalField = ?,'+ ' Boo
我们将代码移植到Delphi XE2,并且需要将我们的数据访问组件从不再业务的第三方ODBCExpress更改为dbExpress的TSQLQuery.
我们有参数化的SQL查询,例如: sSQL := 'UPDATE ZTestData SET '+ ' StringField =?,'+ ' IntField = ?,'+ ' DecimalField = ?,'+ ' BooleanField = ?,'+ ' DateTimeField = ?,'+ ' TextField = ? '+ ' WHERE UniqueID = 3'; 如果我们使用以下代码: var qry:TSQLQuery; begin qry.Close; qry.SQL.Text := sSQL; ShowMessage(IntToStr(qry.Params.Count)); end; 它返回0,所以我们无法使绑定工作,但如果我们将sSQL更改为: sSQL := 'UPDATE ZTestData SET '+ ' StringField =:Param1,'+ ' IntField = :Param2,'+ ' TextField = ? '+ ' WHERE UniqueID = 3'; 它返回2. 将所有SQL查询更改为新参数语法将是一个很大的麻烦.无论如何TSQLQuery都能识别出来吗?句法? 我看到DBXCommon.TDBXCommand使用了?句法: http://www.andreanolanusse.com/en/parameterized-queries-with-dbexpress-dbx-framework/ 但这意味着丢弃使用TSQLQuery的代码.解决此问题的最快捷/最简单的方法是什么?无论如何,TSQLQuery和TDBXCommand之间的区别在于什么与我相关? 解决方法
我认为最快的方法是使用将实现此功能的类助手,如:
type TMyParamsHelper = class Helper for TSQLQuery public function SetupParams(AParamList: array of Variant): Boolean; overload; function SetupParams(ASQL: string; AParamList: array of Variant): Boolean; overload; end; // implementation function TMyParamsHelper.SetupParams(AParamList: array of Variant): Boolean; var Index: Integer; begin // here you can process the SQL as text and replace each ? // with :paramINDEX // first occurence of ? will be :param0,second will be :param1,etc. // implement your replace algorithm before the "for loop" for Index := Low(AParamList) to High(AParamList) do ParamByName(Format(':param%d',[Index])).AsVaraint := AParamList[ Index ]; // of course you need to do it in a try...except block and return TRUE|FALSE end; function TMyParamsHelper.SetupParams(ASQL: string; AParamList: array of Variant): Boolean; begin SQL.Text := ASQL; Result := SetupParams( AParamList ); end; 所以你现在所要??做的就是打电话: ... ASQLQueryVariable.SetupParams([2012,'Hello World',2.14,'It WORKS!']); // or ASQLQueryVariable.SetupParams( 'UPDATE MyTable SET Year = ?,Title = ?,Cents = ?,Comment = ? WHERE <CLAUSE HERE>',[2012,0.02,'It WORKS!'] ); ... 注意:我正在写这篇文章,可能有拼写错误,可能不是最好的方法…… 让我知道这对你有什么影响,我一直想要“?”而不是ParamByName,但实施它太懒了…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |