我的任务是改变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查询。
显然,如果我不能这样做,我会改变一切并自己构建查询。
提前致谢。
答案 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;