是否可以通过ADO.NET访问SQL Server“副产品消息”?由于文字不足,我所说的“副产品消息”指的是出现在Microsoft SQL Server Management Studio的“消息”选项卡中的输出。我特别想到的是阅读SET STATISTICS TIME ON的输出。在这件事上,SqlDataReader似乎没有提供任何东西。
发布于 2009-04-19 09:48:52
是的,在SqlConnection
类上有一个名为SqlInfoMessage
的事件,您可以将其连接到:
SqlConnection _con =
new SqlConnection("server=.;database=Northwind;integrated Security=SSPI;");
_con.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
事件处理程序将如下所示:
static void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e)
{
string myMsg = e.Message;
}
e.Message
是打印到SQL Server Management Studio中消息窗口的消息。
发布于 2009-04-19 11:29:46
感谢你上面的回复。我刚刚做了一个小实验,发现了一个意想不到的小故障( bug?)从多记录集结果读取消息时(在本例中,通过将STATISTICS TIME设置为ON而生成)。如下所示,即使在最后一个结果集之后,也必须调用NextResult才能获得最后一条消息。如果是单个记录集结果,则不需要执行此操作。
using System;
using System.Data.SqlClient;
namespace TimingTest
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("some_conn_str");
conn.Open();
conn.InfoMessage += new SqlInfoMessageEventHandler(Message);
SqlCommand cmd = new SqlCommand("some_sp", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read()) { };
rdr.NextResult();
while (rdr.Read()) { };
// this is needed to print the second message
rdr.NextResult();
rdr.Close();
conn.Close();
}
static void Message(object sender, SqlInfoMessageEventArgs e)
{
Console.Out.WriteLine(e.Message);
}
}
}
发布于 2018-11-30 19:52:57
基于marc_s' answer,我创建了一个包装器类。
public class SqlInfoMessageWrapper
{
public SqlInfoMessageWrapper(SqlConnection connection)
{
SqlConnection = connection;
connection.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
}
public SqlConnection SqlConnection { get; set; }
public string Message { get; set; }
void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e)
{
Message = e.Message;
}
}
使用示例:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
var messageWrapper=new SqlInfoMessageWrapper(connection) ;
var ret = SqlHelper2.ExecuteNonQuery(connection, CommandType.Text, command, null);
messages+= $"{messageWrapper.Message} number of rows affected {ret} ";
}
https://stackoverflow.com/questions/765142
复制相似问题