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

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

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

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

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

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

ЗЫ: это если речь идёт о MSSQL.
...
Рейтинг: 0 / 0
06.10.2007, 17:27
    #34851866
Ur@
Ur@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
хмм, тогда наверно не подходит SqlCommand, то есть проблема в том что надо откатить весь скрипт если одна из команд не выполнена. (Имплицит-ТА тут наверно тоже не помогут, ведь это тоже отдельные ТА будут).
Реально ли весь скрипт запихать в одну ТА (все CREATE TABLE и CREATE TRIGGER)?
Или как откатить до начала скрипта, если скажем из 20-ти ТА сбилась последняя?
...
Рейтинг: 0 / 0
06.10.2007, 17:29
    #34851869
Ur@
Ur@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
Алексей К
ЗЫ: это если речь идёт о MSSQL.
Таки-да о нём, 2005-том.
...
Рейтинг: 0 / 0
07.10.2007, 07:29
    #34852244
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
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
07.10.2007, 08:38
    #34852259
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
Ur@Имплицит-ТА тут наверно тоже не помогут, ведь это тоже отдельные ТА будутМожно и через implicit. Транзакция действует на уровне соединения.

зы: Рекомендую ознакомится с классами Transaction и TransactionScope. Это альтернатива "ручного" управления транзакциями в соединении MSSQL.
...
Рейтинг: 0 / 0
07.10.2007, 21:06
    #34852752
Ur@
Ur@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
проблема в том что я всё никак не могу начать сам пробовать, потому что занят больше писаниной - пора сдавать, а имплементировать потом.
Алексей К большое спасибо, за Ваши ответы, в принципе именно так я и представлял. Просто как-то сомнения закрались. Особенно после Вашого замечания по поводу 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
08.10.2007, 00:22
    #34852884
saint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
команды Create trigger, create procedure, create view должны быть в отдельных пакетах каждая. если у вас несколько триггеров, то на каждый триггер свой пакет.
а вообще справку читайте
...
Рейтинг: 0 / 0
08.10.2007, 11:00
    #34853277
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое исполнение DDL скрипта
Ur@Если скрипт без GO то можно в одну SqlCommand пихать что-лиДа.

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


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