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

1

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

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

PRINT 'Вставка значений в [AIP_M_SITE_LABELS]'

INSERT INTO [AIP_M_DEV_SITE_LABELS] ЗНАЧЕНИЯ (2,90014, "Индикаторы этапа - Всего этапов", 0, 'of, 0,0)

INSERT INTO [AIP_M_DEV_SITE_LABELS] ЗНАЧЕНИЯ (2,90025, "Ledger _ Ref", 0, "N/A", 0,0)

IF @@ERROR <> 0

НАЧАТЬ

Печать ("Ошибка ввода в [AIP_M_SITE_LABELS]")

GOTO ExecutionFail

КОНЕЦ

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

Теги:
sql-server
winforms

1 ответ

2
Лучший ответ

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

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

StringBuilder sb = new StringBuilder("");

Где бы вы ни находились:

            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 где-нибудь в вашем методе. Будьте осторожны с добавлением к вашему строковому строителю уровня класса и созданием его с помощью метода, который вызывает это событие.

  • 0
    Спасибо за ответ. Как вы предполагаете, я уже использую событие Infomessage для перехвата сообщений, меня смущает слияние обоих !!
  • 0
    И это работает - объединение вывода обработчика сообщений SQLDataReader и Info в построитель строк возвращает именно то, что я ищу. Спасибо за ваше предложение!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню