加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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,但实施它太懒了……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读