C# 在C中访问SQL Server查询的InfoMessages
我正在尝试读取SQL Server通常在“消息”选项卡的SSMS中返回的消息。特别是来自设置统计IO和时间的信息。下面的代码可以工作,但实际上没有给出这个输出。非常感谢您的帮助。多谢各位C# 在C中访问SQL Server查询的InfoMessages,c#,sql-server,C#,Sql Server,我正在尝试读取SQL Server通常在“消息”选项卡的SSMS中返回的消息。特别是来自设置统计IO和时间的信息。下面的代码可以工作,但实际上没有给出这个输出。非常感谢您的帮助。多谢各位 using System; using System.Collections; using System.Data.SqlClient; using System.Data; namespace ConsoleApp { class Program { static void
using System;
using System.Collections;
using System.Data.SqlClient;
using System.Data;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var cn2 = new MedusaPerf.ConnectionStringBuilder().GetTrustedConnectionString("localhost", "AdventureWorks2012", false);
//var cn2 = new MedusaPerf.ConnectionStringBuilder().GetStandardConnectionString("localhost", "AdventureWorks2012", "testuser", "pass", false);
string infoMessageText = "";
try
{
var cmd = "SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT TOP(5) DatabaseLogID, PostTime, Event FROM [dbo].[DatabaseLog];";
cn2.StatisticsEnabled = true;
//cn2.InfoMessage += new SqlInfoMessageEventHandler(InfoMessageHandler);
cn2.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
{
infoMessageText += e.Message.ToString();
};
var daDataOutput = new SqlDataAdapter(cmd, cn2);
DataTable dtOutput = new DataTable();
daDataOutput.Fill(dtOutput);
foreach (DataRow i in dtOutput.Rows)
{
string dataRowOutput = "";
for (int j = 0; j < dtOutput.Columns.Count; j++)
{
dataRowOutput = dataRowOutput + i[j].ToString();
}
Console.WriteLine(dataRowOutput);
}
IDictionary d = cn2.RetrieveStatistics();
string[] keys = new string[d.Count];
d.Keys.CopyTo(keys,0);
for (int x = 0; x < d.Count; x++)
{
Console.WriteLine("{0}\t{1}",keys[x], (long)d[keys[x]]);
}
Console.WriteLine("Success ");
}
catch (Exception)
{
throw;
}
Console.WriteLine(infoMessageText);
Console.WriteLine("Hit Enter to Continue");
System.Console.ReadKey();
}
static void InfoMessageHandler(object sender, SqlInfoMessageEventArgs e)
{
string myMsg = e.Message;
Console.WriteLine(e.Message);
}
}
}
首先,我不认为
SET STATISTICS IO ON
需要。。。io统计信息似乎由SqlConnection类的StatisticsEnabled属性控制
时间统计真的很奇怪。。。我也有同样的问题。。。我发现,当您在“设置统计时间”和“选择”之间插入打印语句时。。。InfoMessage的处理程序会被调用,就像它应该被调用一样。。。一次用于打印语句,一次用于统计
ps:尝试将完整的语句放在此处,但无法提交提交答案时出错。。。希望你能找到你自己…最终的解决方案是Fill方法不会触发InfoMessage方法,因此我无法捕获消息。我在StackOverflow上找到了另一篇文章,阐述了这个原因。下面是工作代码
我添加了打印声明,但这只为该声明提供了时间。用一种全新的眼光,我注意到我可以从我的原始帖子中的SatisticsEnabled输出中获得执行时间,但我仍然看不到逻辑读取计数;而reader.Read{}reader.NextResult;如果您检索像这样的数据,您将获得所有信息消息。。。
SET STATISTICS IO ON
using System;
using System.Collections;
using System.Data.SqlClient;
using System.Data;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var cn2 = new MedusaPerf.ConnectionStringBuilder().GetTrustedConnectionString("localhost", "AdventureWorks2012", false);
//var cn2 = new MedusaPerf.ConnectionStringBuilder().GetStandardConnectionString("localhost", "AdventureWorks2012", "testuser", "pass", false);
string infoMessageText = "";
var cmd = "SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT DatabaseLogID, PostTime, Event FROM [dbo].[DatabaseLog];";
cn2.StatisticsEnabled = true;
cn2.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
{
infoMessageText += e.Message.ToString();
};
cn2.Open();
try
{
SqlCommand comm = new SqlCommand(cmd, cn2);
comm.ExecuteNonQuery();
IDictionary d = cn2.RetrieveStatistics();
string[] keys = new string[d.Count];
d.Keys.CopyTo(keys, 0);
for (int x = 0; x < d.Count; x++)
{
Console.WriteLine("{0}\t{1}", keys[x], (long)d[keys[x]]);
}
Console.WriteLine("Success ");
}
catch (Exception)
{
throw;
}
//Console.Write(conn_InfoMessage());
cn2.Close();
Console.WriteLine(infoMessageText);
Console.WriteLine("Hit Enter to Continue");
System.Console.ReadKey();
}
}
}