Вопрос пользователя заключается в необходимости создания базы данных и выполнения скрипта для создания таблиц, хранимом процедур и других объектов базы данных. Скрипт, который он планирует использовать, был сгенерирован с помощью инструмента SMS. Пользователь нашёл код, который должен был помочь в этом, но столкнулся с ошибкой синтаксиса при выполнении скрипта, связанной с наличием в нём оператора GO.
Описание проблемы
Ошибка, с которой столкнулся пользователь, связана с тем, что команда GO в SQL скриптах используется для разделиния команд в некоторых утилитах, таких как SQLCMD. Однако ADO, который используется в Delphi, не распознаёт эту команду как допустимую. Также пользователь спрашивает о способе проверки существования базы данных перед выполнением скрипта.
Решение проблемы
Чтобы решить проблему с синтаксисом, необходимо удалить все вхождения команды GO из скрипта перед его выполнением. Это можно сделать, например, с помощью простого парсинга текста скрипта.
Для проверки существования базы данных можно использовать запрос к системной таблице sys.databases, который возвращает количество баз данных, соответствующих заданному имени.
ADOQuery.SQL.Text := 'SELECT COUNT(*) FROM sys.databases WHERE name=' + QuotedStr(edtWebDBName.Text);
ADOQuery.Open;
if ADOQuery.Fields[0].AsInteger = 0 then // база данных не существует
begin
// код для создания базы данных
end;
Пример кода
const
Script =
'CREATE TABLE Dummy.[dbo].tblUsers(ID INT, UserName VARCHAR(50)) ' + #13#10 +
'GO ' + #13#10 +
'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (1, ''Jill'') ' + #13#10 +
'GO ' + #13#10 +
'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (2, ''John'') ' + #13#10 +
'GO ' + #13#10 +
'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (3, ''Jack'') ' + #13#10 +
'GO ';
var
DatabaseExist: Boolean;
i: Integer;
begin
try
// Проверка подключения
if not ADOConnection1.Connected then
ADOConnection1.Connected := True;
// Проверка на существование базы данных
ADOQuery1.SQL.Add(Format('SELECT COUNT(*) FROM sys.databases WHERE name=%s', [QuotedStr('Dummy')]));
ADOQuery1.Open;
try
DatabaseExist := ADOQuery1.Fields[0].AsInteger > 0;
finally
ADOQuery1.Close;
end;
// Если база данных не существует, создаём её
if not DatabaseExist then
begin
ADOQuery1.SQL.Text := Format('CREATE DATABASE %s', ['Dummy']);
ADOQuery1.ExecSQL;
end;
// Парсинг скрипта для удаления GO
ADOQuery1.SQL.Text := Script;
for i := ADOQuery1.SQL.Count - 1 downto 0 do
if StartsText('GO', ADOQuery1.SQL[i]) then
ADOQuery1.SQL.Delete(i);
// Выполнение очищенного скрипта
ADOQuery1.ExecSQL;
except
on E: Exception do
ShowMessage(E.Message);
end;
end;
Альтернативные варианты
В качестве альтернативы можно использовать SQLCMD для выполнения скриптов, что обойдёт необходимость в ручном удалении операторов GO.
Для проверки существования базы данных также можно использовать функцию DB_ID, которая возвращает идентификатор базы данных, если та существует.
ADOQuery.SQL.Text := 'SELECT DB_ID(' + edtWebDBName.Text + ')';
ADOQuery.Open;
if ADOQuery.Fields[0].IsNull then
ShowMessage('Создание базы данных не удалось');
Заключение
При выполнении скриптов для создания объектов базы данных в Delphi важно понимать различия между командами, которые используются в различных утилитах и теми, которые поддерживаются ADO. Удаление операторов GO перед выполнением скрипта и проверка существования базы данных перед её использованием — ключевые моменты для успешного выполнения задачи.
Пользователь столкнулся с проблемой синтаксиса при попытке выполнить SQL скрипт для создания объектов базы данных в Delphi, связанной с использованием команды `GO`, и ищет способы решения этой проблемы, включая удаление `GO` и проверку существования базы
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.