【发布时间】:2019-08-16 04:04:44
【问题描述】:
我的应用程序的一点点背景。
我正在使用 C# 开发 File Watcher Windows 服务,该服务在特定文件夹中查找 .bak 文件,然后使用它恢复文件所属的数据库。
Restored Database 有一个存储过程,它调用 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] 中调用的存储过程中获取消息输出,如下所示。
只要第一个 SP 调用另一个 SP,我的代码就会停止读取消息。
我想捕获所有正在打印的消息,像这样(下图),这是我在 SSMS 中执行 SP 时正在打印的实际消息。
这一行正在从 SP 获取消息
conn.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
{
message += " -> " + e.Message + " -> ";
};
到目前为止,我已经提到了 this 问题的所有内容,它是 derivatives。
我现在不能更改存储过程,我只能更改我的 C# 应用程序。
希望我的问题很清楚。
【问题讨论】:
标签: c# sql-server sql-server-2008