C# SqlConnection InfoMessage不能与BeginExecutenQuery一起使用
我想打印来自SQL存储过程的消息 如果使用SYNC选项cmd.ExecuteNonQuery连接执行,则会触发InfoMessage事件,但使用ASYNC选项执行时,不会触发该事件 在异步执行时,我没有收到事件有什么原因吗 这是我的密码:C# SqlConnection InfoMessage不能与BeginExecutenQuery一起使用,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我想打印来自SQL存储过程的消息 如果使用SYNC选项cmd.ExecuteNonQuery连接执行,则会触发InfoMessage事件,但使用ASYNC选项执行时,不会触发该事件 在异步执行时,我没有收到事件有什么原因吗 这是我的密码: class Program { static string connstring = "data source = xyz;initial catalog = abc;user id=abc;password=abc;Asynchr
class Program
{
static string connstring =
"data source = xyz;initial catalog = abc;user id=abc;password=abc;Asynchronous Processing=True";
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection(connstring);
conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);
SqlCommand cmd = new SqlCommand("TMP_PROC", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TMP_ID", 1);
try
{
Console.WriteLine("connection open");
conn.Open();
Console.WriteLine("executing query");
//cmd.ExecuteNonQuery();
var result= cmd.BeginExecuteNonQuery(
p =>
{
try
{
var asyncCommand = p.AsyncState as SqlCommand;
Console.WriteLine("Execution Completed");
}
catch (Exception ex)
{
Console.WriteLine("Error:::{0}", ex.Message);
}
finally
{
conn.Close();
}
}, cmd);
int count = 0;
while (!result.IsCompleted)
{
Console.WriteLine("Waiting ({0})", count++);
// Wait for 1/10 second, so the counter
// does not consume all available resources
// on the main thread.
System.Threading.Thread.Sleep(100);
}
}
catch (Exception ex)
{
Console.WriteLine("Error:::{0}" ,ex.Message);
}
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
Console.ReadLine();
}
static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
foreach (var error in e.Errors)
{
Console.WriteLine("---------------------------------------------------");
Console.WriteLine("Source {0} $ Message{1} $ error{2}", e.Source, e.Message,
error.ToString()
);
}
}
很简单,;您必须在回调中调用EndExecuteNonQuery(结果);这将触发事件。作为一般规则,您需要对
IAsyncResult
-styleBegin*
方法调用End*
方法。一个值得注意的例外是Control.BeginInvoke
,它明确地不需要这个。请不要用大写字母写文章。我想我们早在90年代就说过“我必须从SQL存储过程中获取打印消息。”-有人吗。。。。为什么您需要从存储的进程打印,除非您正在调试?在这里,修复了大写的东西。没有必要进一步否决他。至于“你为什么要……”这一点,答案是(或者更确切地说是)遗留存储过程支持。。。我们不能总是重写存储的进程,因为它们是用打印语句编写的。我就是这样,我很想知道为什么InfoMessage事件没有触发。在我的例子中,我只是在命令对象上调用ExecuteNonQuery()。但是InfoMessage事件似乎与命令使用的连接相关联。感谢您的帮助。