Секреты Delphi. Выполнение пакета SQL-команд с использованием TADOConnection
Секреты Delphi. Выполнение пакета SQL-команд с использованием TADOConnection
Для выполнения SQL-команд чаще всего используется компонента TADOCommand, расположенная в палитре компонент ADO.
Но для выполнения простых SQL-команд, не содержащих bind-параметров, более предпочтительным способом является использование метода Execute компоненты TADO Connection.
При этом нет дополнительных посредников, и, соответственно, требуется меньше ресурсов.
К сожалению, при вызове метода Execute выполняется только одна SQL-команда. Это не очень удобно при выполнении SQL-скриптов.
Для решения этой задачи попробуем написать собственную функцию. SQL-команды будем разделять друг от друга при помощи определенного символа-разделителя, например, ";".
Ниже приведен пример реализации данной функции:
function TDM.executeSql Command(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(de-lemiterChar,tmpStr);
while Not(Self.fNeed Terminate) and (delemiterPos > 0) do
begin
sqlCommandText:=Copy (tmpStr,1,delemiterPos-1);
tmpStr:=Copy(tmpStr,delemiterPos+1,Length(tmpStr));
if (Trim(sqlCommand Text)<> '') and dbConnection. Connected then
dbConnection.Exe-cute(sqlCommandText,cmdText,[]);
Application.Process Messages;
delemiterPos:=pos (delemiterChar,tmpStr);
end;
if (Trim(tmpStr)<> '') and dbConnection.Connected then
dbConnection. Execute(tmpStr,cmdText,[]);
except
if dbConnection.In Transaction then
dbConnection.Rollback Trans;
result:=false;
end;
end;
Данная функция не претендует на полное решение поставленной задачи, так как в ней нет синтаксического разбора текста SQL-команды, и, соответственно, она не будет корректно обрабатывать строковые данные, содержащие символ-разделитель, а также закомментированный текст SQL-команды.
Но, тем не менее, эта функция существенно упрощает работу.
Сергей Бердачук, http://bs_elbis.at.tut.by
Для выполнения SQL-команд чаще всего используется компонента TADOCommand, расположенная в палитре компонент ADO.
Но для выполнения простых SQL-команд, не содержащих bind-параметров, более предпочтительным способом является использование метода Execute компоненты TADO Connection.
При этом нет дополнительных посредников, и, соответственно, требуется меньше ресурсов.
К сожалению, при вызове метода Execute выполняется только одна SQL-команда. Это не очень удобно при выполнении SQL-скриптов.
Для решения этой задачи попробуем написать собственную функцию. SQL-команды будем разделять друг от друга при помощи определенного символа-разделителя, например, ";".
Ниже приведен пример реализации данной функции:
function TDM.executeSql Command(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(de-lemiterChar,tmpStr);
while Not(Self.fNeed Terminate) and (delemiterPos > 0) do
begin
sqlCommandText:=Copy (tmpStr,1,delemiterPos-1);
tmpStr:=Copy(tmpStr,delemiterPos+1,Length(tmpStr));
if (Trim(sqlCommand Text)<> '') and dbConnection. Connected then
dbConnection.Exe-cute(sqlCommandText,cmdText,[]);
Application.Process Messages;
delemiterPos:=pos (delemiterChar,tmpStr);
end;
if (Trim(tmpStr)<> '') and dbConnection.Connected then
dbConnection. Execute(tmpStr,cmdText,[]);
except
if dbConnection.In Transaction then
dbConnection.Rollback Trans;
result:=false;
end;
end;
Данная функция не претендует на полное решение поставленной задачи, так как в ней нет синтаксического разбора текста SQL-команды, и, соответственно, она не будет корректно обрабатывать строковые данные, содержащие символ-разделитель, а также закомментированный текст SQL-команды.
Но, тем не менее, эта функция существенно упрощает работу.
Сергей Бердачук, http://bs_elbis.at.tut.by
Компьютерная газета. Статья была опубликована в номере 06 за 2004 год в рубрике программирование :: delphi