powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Автоматическое исполнение DDL скрипта
11 сообщений из 11, страница 1 из 1
Автоматическое исполнение DDL скрипта
    #34835270
Ur@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ur@
Гость
Пишу тут курсовую, как всегда не успеваю в срок. Поэтому прошу совета, бывалым наверно известно решение.

Скрипт для создания схемы БД генерится по шаблонам в текстовый файл. Надо запустить выполнение этого скрипта одной транзакцией из приложения, скажем по нажатии WinForm-кнопки, очень надо чтоб при откате в случае проблем вываливалось исключение или Event.

По сему вопрос: кто как бы это организовал? Можно ли припаять sqlcmd к своему приложению, то есть использовать его для запуска ТА и получать от него внятно "Сделано" и/или "Облом" чтобы соответсвенно моё приложение было в курсе?

Заранее благодарю.

з.ы. прошу не бить если ответ уже лежит в форме, я сюда недавно начал заходить, а поиск принес ноль совпадений на запрос "автоматическое исполнение скрипта". За ссылку на соответсвующую ветку форума буду признателен.
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34835293
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитать текстовый файл в строку и выполнить через SqlCommand?
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34851522
Ur@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ur@
Гость
Было бы круто. Я думал что SQLCommand только одну команду может выполнить, а не весь скрипт махом...
Пока что пытаюсь отладить скрипт через манагемент студию. Как отлажу попробую. Интерессно если поставить в начале скрипта SET IMPLICIT_TRANSACTIONS ON и в конце COMMIT TRANSACTION то SQLCommand тоже схавает и всё правильно сделает?..

зюыю приятно что здесь так быстро отвечают.
-----------------------------------
Вот поезжайте в Лондон, станьте на углу в Сити и спросите Нахлобуча :)
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34851655
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не следует забывать, что sql-скрипт может быть разбит на батчи, которые должны запускаться через SqlCommand отдельно. Разбиение на батчи как правило производится командой GO.

ЗЫ: это если речь идёт о MSSQL.
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34851866
Ur@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ur@
Гость
хмм, тогда наверно не подходит SqlCommand, то есть проблема в том что надо откатить весь скрипт если одна из команд не выполнена. (Имплицит-ТА тут наверно тоже не помогут, ведь это тоже отдельные ТА будут).
Реально ли весь скрипт запихать в одну ТА (все CREATE TABLE и CREATE TRIGGER)?
Или как откатить до начала скрипта, если скажем из 20-ти ТА сбилась последняя?
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34851869
Ur@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ur@
Гость
Алексей К
ЗЫ: это если речь идёт о MSSQL.
Таки-да о нём, 2005-том.
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34852244
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ur@хмм, тогда наверно не подходит SqlCommand, то есть проблема в том что надо откатить весь скрипт если одна из команд не выполнена. (Имплицит-ТА тут наверно тоже не помогут, ведь это тоже отдельные ТА будут).
Реально ли весь скрипт запихать в одну ТА (все CREATE TABLE и CREATE TRIGGER)?
Или как откатить до начала скрипта, если скажем из 20-ти ТА сбилась последняя?Не пойму, в чем проблема. Берём SqlCommand, и далее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public class ExecuteSqlScript
{
   private void ExecSql(SqlConnection cn, string sql)
   {
      SqlCommand cmd = new SqlCommand(sql, cn);
      cmd.ExecuteNonQuery();
   }

   public void Start(string fileName)
   {
      using(SqlConnection cn = new SqlConnection(<строка соединения>))
      {
         cn.Open();
         ExecSql(cn, "begin tran");
         try
         {
              while(<есть ещё батчи>)
              {
                   ExecSql(cn, <текущий батч>);
              }
              ExecSql(cn, "commit tran");
         }
         catch(SqlException)
         {
             ExecSql(cn, "if @@trancount > 0 rollback tran");
             throw;
         }
      }
   }
}
Данный код не претендует на концептуальную правильность, просто показал план действий. Код не проверялся, возможны ошибки, но принцип, думаю, должен быть понятен.
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34852259
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ur@Имплицит-ТА тут наверно тоже не помогут, ведь это тоже отдельные ТА будутМожно и через implicit. Транзакция действует на уровне соединения.

зы: Рекомендую ознакомится с классами Transaction и TransactionScope. Это альтернатива "ручного" управления транзакциями в соединении MSSQL.
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34852752
Ur@
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ur@
Гость
проблема в том что я всё никак не могу начать сам пробовать, потому что занят больше писаниной - пора сдавать, а имплементировать потом.
Алексей К большое спасибо, за Ваши ответы, в принципе именно так я и представлял. Просто как-то сомнения закрались. Особенно после Вашого замечания по поводу GO, в DB2 как-то точки с запятой хватало...
Если скрипт без GO то можно в одну SqlCommand пихать что-ли или всё равно разбивать на отдельные?

Пока что мне GO нужно только что бы CREATE TABLE от CREATE TRIGGER отделить. Иначе MSSQL не хочет: 'CREATE TRIGGER' must be the first statement in a query batch.

Можно ли два скрипта - в одном таблицы, в другом триггеры, оба без разделения GO пускать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
         ExecSql(cn, "begin tran");
         try
         {
                  ExecSql(cn, <скриптCreateTable>);
                  ExecSql(cn, <скриптCreateTrigger>);
                  ExecSql(cn, "commit tran");
         }

О TransactionScope буду читать, спасибо ещё раз.
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34852884
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
команды Create trigger, create procedure, create view должны быть в отдельных пакетах каждая. если у вас несколько триггеров, то на каждый триггер свой пакет.
а вообще справку читайте
...
Рейтинг: 0 / 0
Автоматическое исполнение DDL скрипта
    #34853277
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ur@Если скрипт без GO то можно в одну SqlCommand пихать что-лиДа.

В остальном смотри коментарии от saint.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Автоматическое исполнение DDL скрипта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]