当我使用BeginExecuteNonQuery时,我的输出参数总是为null

时间:2010-05-22 09:33:41

标签: sql-server parameters executenonquery

我有一个存储过程,它返回一个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)

2 个答案:

答案 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真的更快,并且感知到的性能提升不仅仅是因为该进程不等待查询执行。异步查询的重点在于您希望触发长时间的处理,例如生成复杂的报告,然后在完成后再执行某些操作,例如,向用户发送电子邮件,告诉他们他们的报告已经处理完毕。