История переиздания | ||
---|---|---|
Издание 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 команды. Но, тем не менее, данная функция существенно упрощает работу.