#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 и обработчика информационных сообщений в конструктор строк возвращает именно то, что я ищу. Спасибо за ваше предложение!