Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> .NET и SQL Script 
:(
    Опции темы
HellMasterHaiL
Дата 9.8.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 9.8.2006
Где: Россия, МО, г. Юб илейный

Репутация: нет
Всего: 1



Добрго времени суток!
вот меня интересует такой вот вопрос:
как выполниьт SQL скрипт на БД MS SQL 2000 программно?
естественно скрипт содержит и гошки и деклары, и процедуры, и транзакци и дропы...
в общем все что угодно!

так вот надо выполнять их из программы, не используя командной строки (это мы все умеем)
может кто пробовал на SQL DMO реализовать?

PM MAIL ICQ   Вверх
LuMee
Дата 9.8.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



А что сложного? Вот, например:
Код

string script = ... // тут твой скрипт
string commads = script.ToUpper().Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries);

using (SqlConnection connection = new SqlConnection("тут строка подключения"))
{
    SqlCommand command = connection.CreateCommand();

    connection.Open();
    SqlTransaction transaction = connection.BeginTransaction();
    try
    {
        foreach(string commandSql in commands)
        {
            command.CommandText = commandSql;
            command.ExecuteNonQuery();
        }
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}

PM MAIL   Вверх
HellMasterHaiL
Дата 9.8.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 9.8.2006
Где: Россия, МО, г. Юб илейный

Репутация: нет
Всего: 1



с гошками все понятно, и делается проще (просто удаляются все гошки из скрипта и выполняется одной командой)
но по мимо гошек встречается еще типа:
Код

-- Скрипт создания таблици xmlFile

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xmlFile]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[xmlFile]
GO

BEGIN TRANSACTION
CREATE TABLE dbo.xmlFile
    (
    id int NOT NULL IDENTITY (1, 1),
    idType int NOT NULL,
    idStatus int NOT NULL,
    idSours int NULL,
    NameFile varchar(50) NULL,
    VersionFile int NULL,
    PrimFile varchar(200) NULL,
    DateFile datetime NULL,
    EnterPoint int NULL,
    NumSZ int NULL,
    BDMajor int NULL,
    BDMinor int NULL,
    BDRelease int NULL,
    BDBuild int NULL
    )  ON [PRIMARY]
GO
DECLARE @v sql_variant 
SET @v = N'идешка файла'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'id'
GO
DECLARE @v sql_variant 
SET @v = N'тип файла'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'idType'
GO
DECLARE @v sql_variant 
SET @v = N'идешка статуса файла'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'idStatus'
GO
DECLARE @v sql_variant 
SET @v = N'используется только в ответных посылках для отработки экспортных файлов'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'idSours'
GO
DECLARE @v sql_variant 
SET @v = N'название файла'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'NameFile'
GO
DECLARE @v sql_variant 
SET @v = N'рабочая версия файла'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'VersionFile'
GO
DECLARE @v sql_variant 
SET @v = N'примечание'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'PrimFile'
GO
DECLARE @v sql_variant 
SET @v = N'дата формирования файла'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'DateFile'
GO
DECLARE @v sql_variant 
SET @v = N'точка ввода, сформировавшая данный файл'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'EnterPoint'
GO
DECLARE @v sql_variant 
SET @v = N'номер УСЗНа, к которому относится данный файл'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'user', N'dbo', N'table', N'xmlFile', N'column', N'NumSZ'
GO
COMMIT

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
ALTER TABLE dbo.xmlFile ADD CONSTRAINT
    DF_xmlFile_DateFile DEFAULT (getdate()) FOR DateFile
GO
COMMIT

-- КОНЕЦ Скрипт создания таблици xmlFile ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


вот тут сыпется не только на GO)))

PM MAIL ICQ   Вверх
LuMee
Дата 9.8.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



GO удалять просто так нельзя, именно с его помощью скрипт "нарезается" на части, каждая из которых может быть самостоятельно. Без него будут ошибки, например в таком скрипте:
Код

IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL
    DROP PROCEDURE MyProcedure;
GO

CREATE PROCEDURE MyProcedure ...

После удаления GO и попытке выполнить все оптом будет кричать, что CREATE PROCEDURE должен быть первым.
Если же скрипт нужно побить на части, могущие содержать GO, то в качестве разделителя можно использовать что-то еще. Я в свое время вставлял специальный комментарий, выглядело вот так:
Код

IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL
    DROP PROCEDURE MyProcedure;
--Split

CREATE PROCEDURE MyProcedure ...

Далее оставалось только разбить скрипт, используя в качестве разделителя строку "\r\n--Split\r\n". "Лишние" GO из скрипта придется выбрать руками.
PM MAIL   Вверх
HellMasterHaiL
Дата 9.8.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 9.8.2006
Где: Россия, МО, г. Юб илейный

Репутация: нет
Всего: 1



а если скрипт написан ручками, полупьяным кодером, в 4м часу ночи гденить в огороде возле дачи? и он туда гошек не напихал...

хотелось бы скрипт выполнить целиком, без его нарезки на гошки)

PM MAIL ICQ   Вверх
LuMee
Дата 9.8.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



Ну, если этот полупьяный кодер в своем скрипте пытается несколько ХП или вью подряд создать и при этом отчаянно презирает GO, то такой скрипт ничто не спасет. Единственный выход - оперативно кодера похмелить и под угрозой применения ректотермального криптоанализатора вынудить привести скрипт в порядок.
PM MAIL   Вверх
HellMasterHaiL
Дата 9.8.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 9.8.2006
Где: Россия, МО, г. Юб илейный

Репутация: нет
Всего: 1



и еще одно "если":
допустим в скрипте встречается переменная с именем типа LOGOS, то данный способ разрежит ведь это переменную на LO _ GO _ S, что является ошибкой!

ктонибудь знает способ выполнения скрипта одним махом без нарезки?

PM MAIL ICQ   Вверх
LuMee
Дата 9.8.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



Цитата(HellMasterHaiL @ 9.8.2007,  14:19)
и еще одно "если":
допустим в скрипте встречается переменная с именем типа LOGOS, то данный способ разрежит ведь это переменную на LO _ GO _ S, что является ошибкой!

ктонибудь знает способ выполнения скрипта одним махом без нарезки?

GO всегда вставляется с новой строки. Т.е. разбивку надо делать не по GO, а по \r\n\GO. Тогда проблем не будет, если только GO не встречается в коментариях - их нужно будет почистить. Для пущей верности можешь задействовать регулярные выражения ;)
Разом выполнить скрипт в общем случае нельзя, ибо SQL Server никакого GO не знает - это примочка Query Analyzer'а.
PM MAIL   Вверх
HellMasterHaiL
Дата 9.8.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 9.8.2006
Где: Россия, МО, г. Юб илейный

Репутация: нет
Всего: 1



Цитата(LuMee @ 9.8.2007,  14:38)
Разом выполнить скрипт в общем случае нельзя, ибо SQL Server никакого GO не знает - это примочка Query Analyzer'а.

ну есть же такая консолька osql, которая херачит весь скрипт разом... только к ней обращаться надо по командной строке... не ужто через SQLDMO нельзя как-то до подобного дорыться?
ведь делается же бекапы или ресторы БД прямо в приложении... даже процентики показываются)))

PM MAIL ICQ   Вверх
LuMee
Дата 10.8.2007, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



Цитата(HellMasterHaiL @ 9.8.2007,  14:47)
ну есть же такая консолька osql, которая херачит весь скрипт разом... 

А ты точно знаешь, что она именно этот скрипт разом обрабатывает, а не нарезает на части? smile
И потом, что мешает эту самую утилитку задействовать? Пусть твоя программа ее запускает и подсовывает ей нужный скрыпт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.