Немного предыстории моего приложения.
Я работаю над File Watcher службой Windows, используя C # , который ищет .bak файлов в определенной папке, а затем используйте ее для восстановления базы данных, к которой принадлежит этот файл.
В восстановленной базе данных есть хранимая процедура, которая вызывает 10 различных хранимых процедур.Это File Watcher's функциональность для выполнения хранимой процедуры после восстановления.
Хранимая процедура - [1_IMPORT_DATA_AND_PROCESS_ALL]
, которая вызывает внутри себя 10 различных хранимых процедур.
Это метод, который выполняет хранимую процедуру после завершения восстановления.
// Trigger Stored Procedure after restore.
private void triggerSP(String connectionStr)
{
// This doesn't open the Connection. conn.Open() has to be explicitly called.
SqlConnection conn = new SqlConnection(connectionStr);
try
{
conn.Open();
conn.FireInfoMessageEventOnUserErrors = true;
// Capture messages returned by SQL Server.
conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
{
message += " -> " + e.Message + " -> ";
};
//conn.InfoMessage += new SqlInfoMessageEventHandler(cn_InfoMessage);
//.create a command object identifying the stored procedure.
SqlCommand cmd = new SqlCommand("[dbo].[1_IMPORT_DATA_AND_PROCESS_ALL]", conn);
cmd.CommandTimeout = 0;
// 2. set the command object so it knows to execute a stored procedure.
cmd.CommandType = CommandType.StoredProcedure;
// Add a check here as well.
// execute the command.
SqlDataReader rdr = cmd.ExecuteReader();
string[] info = new string[] { "Message: \n" + message };
WriteToFile(info);
// Since we are not using - using block we have to explicitly call Close() to close the connection.
conn.Close();
}
catch (SqlException SqlEx){
string[] error = new string[3] ;
string msg1 = "Errors Count:" + SqlEx.Errors.Count;
string msg2 = null;
foreach (SqlError myError in SqlEx.Errors)
msg2 += myError.Number + " - " + myError.Message + "/" ;
conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
{
message += "\n" + e.Message;
};
error[0] = msg1;
error[1] = msg2;
error[2] = message;
WriteToFile(error);
}
finally
{
//call this if exception occurs or not
//in this example, dispose the WebClient
conn.Close();
}
}
Проблема
Я получаю обратно сообщения только из самой первой хранимой процедуры, т.е. [1_IMPORT_DATA_AND_PROCESS_ALL]
, а не из хранимой процедуры, которая вызывается из [1_IMPORT_DATA_AND_PROCESS_ALL]
, как показано ниже.

Как только 1-й Sp вызывает другого SP, мои коды перестают читать Сообщения.
Я хочу захватить все Сообщениякоторые печатаются, что-то вроде этого (изображение ниже), которые являются фактическими сообщениями, которые печатаются, когда я выполняю SP в SSMS.

Эта конкретная строка извлекает Сообщения от SP
conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
{
message += " -> " + e.Message + " -> ";
};
До сих пор я ссылался на все, что касается этого вопроса, и это производных .
Я не могу изменитьХранимая процедура теперь я могу вносить изменения только в свое приложение C #.
Надеюсь, мой вопрос понятен.