我有一个存储过程,它返回一个varchar(160)作为存储过程的输出参数。
当我使用ExecuteNonQuery时,一切正常,我总是回到预期值。
但是,一旦我切换到使用BeginExecuteNonQuery,我得到输出的空值。
我正在使用connString +“Asynchronous Processing = true;”在这两种情况下。
可悲的是,在我的情况下,BeginExecuteNonQuery大约快了1.5倍......但我确实需要输出参数。
谢谢!
编辑:这是我处理BeginExecuteNonQuery回调的方式(我正在使用.net 4.0 ...)
Dim resp as String=""
cmd.BeginExecuteNonQuery(Sub(result As IAsyncResult)
Dim c As SqlCommand = Nothing
Try
c = CType(result.AsyncState, SqlCommand)
c.EndExecuteNonQuery(result)
**resp = CStr(c.Parameters("@response").Value)**
Catch ex As Exception
WriteLog("ERR - LogRequest - " & ex.Message)
Finally
c.Connection.Close()
c.Dispose()
End Try
End Sub, cmd)
答案 0 :(得分:2)
当您使用BeginExecuteNonQuery
时,查询将在后台运行,并且您的代码将继续运行。可能发生的是您在查询完成执行之前查看结果。这来自BeginExecuteNonQuery
的msdn帮助:
IAsyncResult result = command.BeginExecuteNonQuery();
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);
}
Console.WriteLine("Command complete. Affected {0} rows.",
command.EndExecuteNonQuery(result));
因此,只有IsCompleted
为真,才能正常使用结果。
请注意,这只是文档中的一个示例,异步函数的实际用途是允许您的应用程序的其余部分(例如您的UI)在运行长查询时继续运行。
答案 1 :(得分:1)
如果您使用BeginExecuteNonQuery,您的代码不会在继续之前等待查询执行,这就是您没有输出参数的原因。要检索out参数,您需要指定在查询完成执行时运行的AsyncCallback委托。您还确定BeginExecuteNonQuery真的更快,并且感知到的性能提升不仅仅是因为该进程不等待查询执行。异步查询的重点在于您希望触发长时间的处理,例如生成复杂的报告,然后在完成后再执行某些操作,例如,向用户发送电子邮件,告诉他们他们的报告已经处理完毕。