从ado对象输出mysql查询

时间:2011-12-21 21:09:09

标签: mysql delphi ado

我的任务是改变delphi程序在这里的工作。该应用程序用于连接一个mysql服务器,并与ado一起运行查询。现在服务器已经更改为不接受外部连接的服务器,我们决定将应用程序转换为连接到web服务并通过那里发送mysql更新查询。

除了一件事,我的一切都在运作。因为我不想改变太多的东西(当时很多c ++构建器都回来了,但现在已经10年了)我决定将ado对象放在适当的位置并尝试让它输出它生成的mysql我可以把它发送到网络服务(希望我有意义)。 我遇到的问题是我发现的唯一的事情是

ShowMessage (DataModuleDB.adoqClients.SQL.Text);

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

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

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

显然,如果我不能这样做,我会改变一切并自己构建查询。

提前致谢。

1 个答案:

答案 0 :(得分:3)

实际的参数替换发生在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;