Мы портируем код на Delphi XE2 и должны изменить наши компоненты доступа к данным от стороннего ODBCExpress, который больше не находится в бизнесе, TSQLQuery dbExpress.Может ли использовать TSQLQuery dbExpress? как параметры?
Мы параметризованные 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, '+
' DecimalField = ?, '+
' BooleanField = ?, '+
' DateTimeField = ?, '+
' TextField = ? '+
' WHERE UniqueID = 3';
возвращает 2.
Это будет большой хлопот, чтобы изменить все SQL-запросы на новый синтаксис параметров. В любом случае TSQLQuery распознает? синтаксис?
Я вижу, что DBXCommon.TDBXCommand использует? Синтаксис:
http://www.andreanolanusse.com/en/parameterized-queries-with-dbexpress-dbx-framework/
Но это означало бы, выбрасывая наш код, который использует TSQLQuery. Какой самый быстрый или простой способ решить эту проблему? В чем разница между TSQLQuery и TDBXCommand в любом случае, с точки зрения того, что мне подходит?
См. Мой ответ. DB.TParams.ParseSQL - это метод, который преобразует параметры в вопросительные знаки, если это маршрут, на который вы хотите пойти. Я очень предпочитаю ParamByName. – Robo