Выполните сценарий SQL от C# и регистрирующихся ошибок

Я пытаюсь выполнить сценарий (.sql файл) на базе данных из Приложения Windows C#. Файл SQL содержит, 'ИДУТ' заявления; это означает, что я использую объект SMO.

Я пробую к <�сильному>, продолжаются на ошибке и также регистрация любая ошибка , который мог бы произойти во время выполнения сценария на базе данных. Там какой-либо путь состоит в том, чтобы сделать это?

Это - код, который я использую:

using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
    ServerConnection svrConnection = new ServerConnection(sqlConnection);
    Server server = new Server(svrConnection);

    string script = File.ReadAllText("upgradeDatabase.sql");

    try
    {
        server.ConnectionContext.ExecuteNonQuery(script, ExecutionTypes.ContinueOnError);
     }
     catch (Exception ex)
     {
         //handling and logging for the errors are done here
     }
}

Любая помощь ценится!

5

6 ответы

Я думаю, что у вас есть две проблемы здесь:

Во-первых, вы называете метод ExecuteNonQuery, который принимает последовательность и не StringCollection. Я предполагаю, что этот метод не признает, что ДВИЖЕНИЕ раньше отделяло пакетные заявления. Вместо этого документация метода ExecuteNonQuery это принимает StringCollection государства, которые признаны Движения

Вторая проблема - ExecutionTypes. ContinueOnError прошел. В этом случае та же самая документация указывает, что вы не можете получить исключения, если что-то терпит неудачу.

Я думаю, что лучший подход должен быть должен разделить ваш входной текст в ДВИЖЕНИИ и затем построить a StringCollection пройти к методу ExecuteNonQuery и проверить возвращенный массив затронутых рядов. Что-то вроде этого (должен быть проверен),

using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
    ServerConnection svrConnection = new ServerConnection(sqlConnection);
    Server server = new Server(svrConnection);

    string script = File.ReadAllText("upgradeDatabase.sql");
    string[] singleCommand = Regex.Split(script, "^GO", RegexOptions.Multiline);
    StringCollection scl = new StringCollection();
    foreach(string t in singleCommand)
    {
        if(t.Trim().Length > 0) scl.Add(t.Trim());
    }
    try
    {
        int[] result = server.ConnectionContext.ExecuteNonQuery(scl, ExecutionTypes.ContinueOnError);
       //Now check the result array to find any possible errors??
     }
     catch (Exception ex)
     {
         //handling and logging for the errors are done here
     }
}

Конечно, альтернатива выполняет каждого отдельного оператора, и удалите ContinueOnError флаг. Тогда захватите и сделайте запись возможных исключений. Но это будет, конечно, медленнее.

4
добавлено
Вам нужен образец, который матчи ИДУТ как единственный ' statement' на линии нечувствительной к регистру, и почести, дополнительные ИДУТ nnn синтаксис. ДВИЖЕНИЕ также на самом деле конфигурируемо, есть сценарии там то использование ; как пакетный разделитель (don' t спрашивают...). Например, посмотрите "^\\b*" + BatchDelimiter + "\b* (\d*)", от github.com/rusanu/DbUtilSqlCmd/blob/master/trunk/src/SqlCmd.‌ ​ cs
добавлено автор Remus Rusanu, источник
@Steve: верный, но думают во всех, которые наткнутся на эту почту позже и использовать код w/o рассмотрение ' details'.
добавлено автор Remus Rusanu, источник
Разделение с ИДЕТ в тексте, мог сломать Сценарий, Предположить, что необходимо ВЫБРАТЬ CATE , ИДУТ РАЙ ОТ ЧТО
добавлено автор Satinder singh, источник
Вы имеете отмеченными, что я использую образец Regex, которые прикрепляют ДВИЖЕНИЕ к началу линии? msdn.microsoft.com/en-US/library/az24scfc (v=vs.90)
добавлено автор Steve, источник
@RemusRusanu I' m уверенный вы правы, но конечно это могло быть совершенно не нужно, если сценарий управляется/создается тем же самым человеком/организацией, которые используют его. И, вероятно дело обстоит так, если я понимаю, каково это "upgradeDatabase.sql" имя файла.
добавлено автор Steve, источник
Спасибо Стив для вашей работы. Я выполняю каждого отдельного оператора и фиксирую любую ошибку, если происходит.
добавлено автор naregkar, источник

можно использовать smo библиотека, где то, как добавить к проекту

FileInfo file = new FileInfo("upgradeDatabase.sql");
string script = file.OpenText().ReadToEnd();
SqlConnection conn = new SqlConnection(sqlConnectionString);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);
0
добавлено
Можете быть вы, получают ошибку, потому что у вас donot есть smo dll пакет reffrerd в вашем проекте @Mohit
добавлено автор SRJ, источник
downvoter, пожалуйста, оставьте комментарий
добавлено автор Arsen Mkrtchyan, источник
Ahh, право @DavidWhite, благодарит за исправление
добавлено автор Arsen Mkrtchyan, источник
каково сообщение исключения?
добавлено автор Arsen Mkrtchyan, источник
привет @ArsenMkrt, я - попытка использовать ваш ответ, но я получаю ошибку на Сервере server=new.. линия может вы, пожалуйста, говорить мне, который является собранием и пространством имен для Сервера.. Спасибо
добавлено автор Mohit Kumar, источник
С вашим ответом сценарий остановит выполнение в первой ошибке. Я ожидаю, что OP был после всех ошибок. (не downvoter)
добавлено автор David White, источник

Мне действительно нравится этот вариант, который использует событие InfoMessage и укладчика:

        using(SqlConnection sc = new SqlConnection(connStr))
        {
            sc.InfoMessage += new SqlInfoMessageEventHandler(sc_InfoMessage);
            Server db = new Server(new ServerConnection(sc));
            db.ConnectionContext.ExecuteNonQuery(commandFileText, ExecutionTypes.ContinueOnError); 
        }

Необходимо будет добавить ссылку на следующее:

  • Microsoft. SqlServer. ConnectionInfo.dll
  • Microsoft. SqlServer. Управление. Sdk. Sfc.dll
  • Microsoft. SqlServer. Smo.dll
  • Microsoft. SqlServer. SqlEnum.dll
0
добавлено

Мне действительно нравится этот вариант, который использует событие InfoMessage и укладчика:

        using(SqlConnection sc = new SqlConnection(connStr))
        {
            sc.InfoMessage += new SqlInfoMessageEventHandler(sc_InfoMessage);
            Server db = new Server(new ServerConnection(sc));
            db.ConnectionContext.ExecuteNonQuery(commandFileText, ExecutionTypes.ContinueOnError); 
        }

Необходимо будет добавить ссылку на следующее:

  • Microsoft. SqlServer. ConnectionInfo.dll
  • Microsoft. SqlServer. Управление. Sdk. Sfc.dll
  • Microsoft. SqlServer. Smo.dll
  • Microsoft. SqlServer. SqlEnum.dll
0
добавлено

Я не программист (DBA), поэтому я не уверен. Я предполагаю, что следующее может быть полезным

svrConnection. FireInfoMessageEventOnUserErrors = верный;

0
добавлено

Я не программист (DBA), поэтому я не уверен. Я предполагаю, что следующее может быть полезным

svrConnection. FireInfoMessageEventOnUserErrors = верный;

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)