【问题标题】:Outputting the mysql query from a ado object从 ado 对象输出 mysql 查询
【发布时间】:2011-12-21 21:09:08
【问题描述】:

我的任务是改变 delphi 程序在工作中的作用。该应用程序也用于连接 mysql 服务器,并且顺便运行查询。现在服务器已更改为不接受外部连接的服务器,因此我们决定将应用程序转换为连接到 Web 服务并通过那里发送 mysql 更新查询。

除了一件事,我什么都可以工作。因为我不想改变太多东西(过去做了很多 c++builder,但那是 10 年前的事了)我决定将 ado 对象留在原处并尝试让它输出它生成的 mysql 所以我可以将它发送到网络服务(希望我有意义)。 我遇到的问题是我发现的唯一问题是

ShowMessage (DataModuleDB.adoqClients.SQL.Text);

但这会在被ado改变之前输出mysql:

insert into table clients (id, name) values (:id, :name)

所以我的问题是如何(如果可能的话)在不执行它的情况下显示“真正的”mysql 查询。

显然,如果我不能这样做,我将更改所有内容并自己构建查询。

提前致谢。

【问题讨论】:

    标签: mysql delphi ado


    【解决方案1】:

    实际的参数替换发生在 VCL 之外,迟到 SQL Server 本身(允许重用查询计划)。
    如果您仍然需要替换的 SQL,您可以使用 ADOQuery 的 Command.CommandObject.CommandText 并替换 '?'使用参数值自己。
    AFAIK,ADO 只关心正确的顺序和类型......

    类似:

    type
      THackADOQuery = class(TADOQuery);
    
    function DecodeSQL(AADOQuery: TADOQuery): string;
    var
      curParam: TCollectionItem;
    begin
      Result := THackADOQuery(AADOQuery).Command.CommandObject.CommandText;
      for curParam in AADOQuery.Parameters do
      begin
        case TParameter(curParam).DataType of
          ftString, ftWideString: Result := StringReplace(Result, '?', QuotedStr(TParameter(curParam).Value), []);
          else
            Result := StringReplace(Result, '?', TParameter(curParam).Value, []);
        end;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(DecodeSQL(ADOQuery1));
      ADOQuery1.ExecSQL;
    end;
    

    【讨论】:

    • +1,很好的编辑 ;) 我只建议将 TADOQuery 更改为 TCustomADODataSet。所以它将适用于所有后代。
    • 此外,您需要处理 NULL、日期/时间/guid/bool 以及可能更多的参数类型,具体取决于数据库(OP 使用 MySQL)。恕我直言,创建一个涵盖所有提供者的通用编码函数的任务并不是那么简单......
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2017-12-11
    • 2021-10-15
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多