Возвращает результаты и сообщения из хранимой процедуры SQL в C # winform

#c# #sql-server #winforms

#c# #sql-сервер #winforms

Вопрос:

Мне была предоставлена хранимая процедура, которую необходимо запустить в SSMS с выбранным параметром «результаты в текст», чтобы результаты и сообщения отображались в правильном порядке.

Причина в том, что хранимый процесс используется для создания сценария для переноса настроек клиента из одной базы данных в другую, операторы Print используются для обертывания информационных сообщений и обработки ошибок вокруг операторов insert…

ВЫВЕСТИ «Вставка значений в [AIP_M_SITE_LABELS]»

ВСТАВИТЬ В [AIP_M_DEV_SITE_LABELS] ЗНАЧЕНИЯ (2,90014, ‘Индикаторы этапов — всего этапов’,0,’of’,0,0)

ВСТАВИТЬ В [AIP_M_DEV_SITE_LABELS] ЗНАЧЕНИЯ (2,90025, ‘Ledger _ Ref’,0,’N/A’,0,0)

ЕСЛИ @@ОШИБКА <> 0

НАЧАТЬ

Print(‘Ошибка вставки в [AIP_M_SITE_LABELS]’)

GOTO ExecutionFail

ЗАВЕРШЕНИЕ

Есть ли способ выполнить эту хранимую процедуру в моей c # winform, которая позволит мне сохранить этот вывод? До сих пор мне удавалось получать результирующие наборы и сообщения по отдельности, но еще не «объединены» и в правильном порядке.

Ответ №1:

Вам необходимо подписаться на событие InfoMessage вашего объекта SqlConnection. Что-то вроде этого должно сработать:

Определите это на уровне класса, чтобы ваш обработчик событий мог получить к нему доступ:

 StringBuilder sb = new StringBuilder("");
 

Где бы ни находился ваш материал SQL:

             var conn = new SqlConnection("your connection string");
        conn.Open();
        conn.InfoMessage  = conn_InfoMessage;
        var commandText = "your SP name";
        var command = new SqlCommand(commandText, conn) {CommandType = CommandType.StoredProcedure};
        command.ExecuteNonQuery();
 

Обработчик событий для захвата данных (не обязательно должен быть статическим, но у меня есть):

     static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
    {
        sb.AppendLine(e.Message);
    }
 

Редактировать

Только что видел вашу заметку о получении результатов печати и задания за 1 снимок. Вместо того , чтобы использовать .ExecuteNonQuery(), используйте .ExecuteReader() и используйте SqlDataReader, как обычно. Ваше событие InfoMessage все равно должно сработать, и вам нужно будет вручную объединить результаты как события SqlDataReader, так и события InfoMessage где-нибудь в вашем методе. Будьте осторожны с добавлением к вашему stringbuilder уровня класса и выполнением с ним действий в методе, который вызывает срабатывание этого события.

Комментарии:

1. Спасибо за ответ — Как вы предполагаете, я уже использую событие Infomessage для перехвата сообщений, меня ставит в тупик слияние обоих!!

2. И это работает — объединение выходных данных SqlDataReader и обработчика информационных сообщений в конструктор строк возвращает именно то, что я ищу. Спасибо за ваше предложение!