- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想打印来自 SQL 存储过程的消息。
如果我使用 SYNC 选项执行 cmd.ExecuteNonQuery 连接会触发 InfoMessage 事件,但是当我使用 ASYNC 选项执行时,该事件不会被触发。
在异步执行时我没有收到事件是否有原因?
这是我的代码:
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(result);这将触发事件。作为一般规则,您需要在IAsyncResult
风格的Begin*
方法上调用End*
方法.一个值得注意的异常(exception)是 Control.BeginInvoke
,它明确不需要这样做。
关于c# - SqlConnection InfoMessage 不适用于 BeginExecuteNonQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8252734/
我想打印来自 SQL 存储过程的消息。 如果我使用 SYNC 选项执行 cmd.ExecuteNonQuery 连接会触发 InfoMessage 事件,但是当我使用 ASYNC 选项执行时,该事件不
我有以下代码: using (SqlConnection sqlConnection = new SqlConnection("blahblah;Asynchronous Processing=tru
我有一个存储过程,它返回一个 varchar(160) 作为存储过程的输出参数。 当我使用 ExecuteNonQuery 时一切正常,我总是能取回预期值。 但是,一旦我切换到使用 BeginExec
给定以下代码: Dim t As Date = Now Dim e As New AsynchronousExecutionEventArgs
我有一个存储过程,它写入特定数据库的备份。我在 C#/Windows 窗体应用程序中异步调用此 SP。这是代码片段: IAsyncResult result = command.BeginExecut
我有一些工作的 C# 代码使用 SqlConnection 创建临时表(例如,#Foo),调用存储过程来填充这些临时表并将结果返回到 C# 客户端,使用 c# 对这些结果执行复杂的计算,并使用计算结果
我是一名优秀的程序员,十分优秀!