2

我有一个存储过程,它返回一个 varchar(160) 作为存储过程的输出参数。

当我使用 ExecuteNonQuery 时一切正常,我总是能取回预期值。

但是,一旦我切换到使用 BeginExecuteNonQuery,我会得到一个空值作为输出。

我正在使用 connString +“异步处理=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)
4

2 回答 2

2

当您使用BeginExecuteNonQuery查询在后台运行时,您的代码会继续运行。可能发生的情况是您在查询完成执行之前查看结果。这是来自 msdn 的帮助BeginExecuteNonQuery

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)在运行长查询时继续运行。

于 2010-05-22T09:53:09.277 回答
1

如果您使用 BeginExecuteNonQuery 您的代码在继续之前不会等待查询执行,这就是您没有输出参数的原因。为了检索 out 参数,您需要指定在查询完成执行时运行的 AsyncCallback 委托。您还确定 BeginExecuteNonQuery 确实更快,并且感知到的性能提高不仅仅是因为该过程只是不等待查询执行。异步查询的要点是您希望启动长时间的处理,例如生成复杂的报告,然后在完成后稍后再做一些事情,例如给用户发电子邮件告诉他们他们的报告已被处理。

于 2010-05-22T09:43:45.280 回答