SQL Server消息输出的c#处理
本文关键字:处理 输出 Server 消息 SQL | 更新日期: 2023-09-27 18:10:42
在SQL Server Management Studio中执行脚本时,通常会生成消息并显示在消息窗口中。例如,在运行数据库备份时:
10%已处理。
20%已处理。
等等……
为数据库'Sample'处理了1722608页,文件'Sampe'在文件1上。
100%处理。
为数据库'Sample'处理了1页,文件'Sample_Log'在文件1上。
BACKUP DATABASE在202.985中成功处理了1722609页秒(66.299 MB/秒).
我希望能够在c#应用程序中显示这些消息,该应用程序正在对数据库运行SQL脚本。但是,我不知道如何从生成的SQL中获取消息输出的句柄。有人知道怎么做吗?对我来说,使用哪种连接框架并不重要。我对LINQ, NHibernate,实体框架,ADO比较熟悉。Net,企业库,我很高兴学习新的。
这是我尝试的示例代码,它适用于我。http://www.dotnetcurry.com/ShowArticle.aspx?ID=344
注意你需要的代码实际上是这一部分:
cn.Open();
cn.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
{
txtMessages.Text += "'n" + e.Message;
};
这是e.Message不断返回消息回txtMessages(你可以替换为文本框或标签)。
你也可以参考这篇文章:备份SQL Server数据库的进度
我的代码示例如下:
//The idea of the following code is to display the progress on a progressbar using the value returning from the SQL Server message.
//When done, it will show the final message on the textbox.
String connectionString = "Data Source=server;Integrated Security=SSPI;";
SqlConnection sqlConnection = new SqlConnection(connectionString);
public void DatabaseWork(SqlConnection con)
{
con.FireInfoMessageEventOnUserErrors = true;
//con.InfoMessage += OnInfoMessage;
con.Open();
con.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
{
//Use textBox due to textBox has Invoke function. You can also utilize other way.
this.textBox.Invoke(
(MethodInvoker)delegate()
{
int num1;
//Get the message from e.Message index 0 to the length of first ' '
bool res = int.TryParse(e.Message.Substring(0, e.Message.IndexOf(' ')), out num1);
//If the substring can convert to integer
if (res)
{
//keep updating progressbar
this.progressBar.Value = int.Parse(e.Message.Substring(0, e.Message.IndexOf(' ')));
}
else
{
//Check status from message
int succ;
succ = textBox.Text.IndexOf("successfully");
//or succ = e.Message.IndexOf("successfully"); //get result from e.Message directly
if (succ != -1) //If IndexOf find nothing, it will return -1
{
progressBar.Value = 100;
MessageBox.Show("Done!");
}
else
{
progressBar.Value = 0;
MessageBox.Show("Error, backup failed!");
}
}
}
);
};
using (var cmd = new SqlCommand(string.Format(
"Your SQL Script"//,
//QuoteIdentifier(databaseName),
//QuoteString(Filename)//,
//QuoteString(backupDescription),
//QuoteString(backupName)
), con))
{
//Set timeout = 1200 seconds (equal 20 minutes, you can set smaller value for shoter time out.
cmd.CommandTimeout = 1200;
cmd.ExecuteNonQuery();
}
con.Close();
//con.InfoMessage -= OnInfoMessage;
con.FireInfoMessageEventOnUserErrors = false;
}
为了让进度条工作,你需要用一个后台工作者来实现它,这样你的应用程序就不会冻结,也不会突然100%完成。
SqlConnection。当SQL server返回警告或提示消息时,发生InfoMessage事件。这个网站展示了一个可能的实现。