| История переиздания | ||
|---|---|---|
| Издание 1.0 | Январь 2004 г. | |
Для выполнения SQL команд чаще всего используется компонента TADOCommand, расположенная в палитре компонент ADO. Но для выполнения простых SQL команд, не содержащих bind параметров, более предпочтительным способом является использование метода Execute компоненты TADOConnection. При этом нет дополнительных посредников, и соответственно требуется меньше ресурсов. К сожалению, при вызове метода Execute, выполняется только одна SQL команда. Это не очень удобно при выполнении SQL скриптов. Для решения этой задачи попробуем написать собственную функцию. SQL команды будем разделять друг от друга при помощи определенного символа-разделителя, например “;”. Ниже приведен пример реализации данной функции:
function TDM.executeSqlCommand(const aCommandText:String):boolean;
var
sqlCommandText:String;
tmpStr:String;
delemiterChar:Char;
delemiterPos:integer;
begin
result:=true;
try
delemiterChar:=';';
Self.fNeedTerminate:=False;
tmpStr:=aCommandText;
delemiterPos:=pos(delemiterChar,tmpStr);
while Not(Self.fNeedTerminate) and (delemiterPos > 0) do
begin
sqlCommandText:=Copy(tmpStr,1,delemiterPos-1);
tmpStr:=Copy(tmpStr,delemiterPos+1,Length(tmpStr));
if (Trim(sqlCommandText)<>'') and dbConnection.Connected then
dbConnection.Execute(sqlCommandText,cmdText,[]);
Application.ProcessMessages;
delemiterPos:=pos(delemiterChar,tmpStr);
end;
if (Trim(tmpStr)<>'') and dbConnection.Connected then
dbConnection.Execute(tmpStr,cmdText,[]);
except
if dbConnection.InTransaction then
dbConnection.RollbackTrans;
result:=false;
end;
end;
Данная функция не претендует на полное решение поставленной задачи, так как нет синтаксического разбора текста SQL команды. И соответственно функция не будет корректно обрабатывать строковые данные, содержащие символ-разделитель, а так же закомментированный текст SQL команды. Но, тем не менее, данная функция существенно упрощает работу.