2

ストアドプロシージャの出力パラメータとしてvarchar(160)を返すストアドプロシージャがあります。

ExecuteNonQueryを使用すると、すべてが正常に機能します。常に期待値が返されます。

ただし、BeginExecuteNonQueryを使用するように切り替えると、出力にnull値が返されます。

connString + "Asynchronous Processing=true;"を使用しています 両方の場合において。

悲しいことに、私の場合、BeginExecuteNonQueryは約1.5倍高速です...しかし、実際には出力パラメーターが必要です。

ありがとう!

編集:これは私がBeginExecuteNonQueryコールバックを処理している方法です(私は.net4.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は、trueが1回だけです。

これはドキュメントの単なる例であることに注意してください。非同期関数の実際の使用法は、長いクエリが実行されている間、アプリの残りの部分(UIなど)が機能し続けることを可能にすることです。

于 2010-05-22T09:53:09.277 に答える
1

BeginExecuteNonQueryを使用する場合、コードは続行する前にクエリの実行を待機しません。そのため、出力パラメーターがありません。outパラメータを取得するには、クエリの実行が終了したときに実行されるAsyncCallbackデリゲートを指定する必要があります。また、BeginExecuteNonQueryが本当に高速であり、知覚されるパフォーマンスの向上は、プロセスがクエリの実行を待機していないという理由だけではないことを確認してください。非同期クエリのポイントは、複雑なレポートを作成するなど、長い処理を開始し、完了したら後で何かを実行することです。たとえば、レポートが処理されたことをユーザーにメールで通知します。

于 2010-05-22T09:43:45.280 に答える