Вывод запроса MySQL из объекта ado - PullRequest
1 голос
/ 22 декабря 2011

Мне поручено изменить то, что программа delphi делает здесь, на работе. Приложение также использовалось для подключения к серверу mysql и запускает запросы. Теперь, когда сервер изменился на тот, который не принимает внешние подключения, было решено, что мы преобразуем приложение для подключения к веб-сервису и отправим туда запрос на обновление mysql.

У меня все работает, кроме одной вещи. Так как я не хотел менять слишком много вещей (много дней назад занимался сборщиком с ++, но это было 10 лет назад), я решил оставить объект ado на месте и попытаться заставить его выводить mysql, который он генерирует так Я могу отправить его в веб-службу (надеюсь, что я имею смысл). Единственная найденная мною проблема была

ShowMessage (DataModuleDB.adoqClients.SQL.Text);

Но это выводит MySQL до того, как он будет изменен ado:

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

Таким образом, мой вопрос заключается в том, как (если это возможно) я могу заставить "настоящий" запрос mysql отображаться без его выполнения.

Очевидно, что если я не смогу сделать это так, я просто поменяю все и сам создам запрос.

Заранее спасибо.

1 Ответ

3 голосов
/ 22 декабря 2011

Фактическая замена параметров происходит вне 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;
...