Мне была предоставлена Хранимая процедура, которую нужно запустить в 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 С#, которая позволит мне сохранить этот вывод? Мне до сих пор удалось получить результирующий набор и сообщения отдельно, но еще не "объединены" и в правильном порядке.
Вам необходимо подписаться на событие 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 где-нибудь в вашем методе. Будьте осторожны с добавлением к вашему строковому строителю уровня класса и созданием его с помощью метода, который вызывает это событие.