私がBeginexecutenonqueryを使用するとき、私の出力パラメーターは常にヌルです

StackOverflow https://stackoverflow.com/questions/2887570

質問

ストアドプロシージャの出力パラメーターとして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)
役に立ちましたか?

解決

BeginexecutenonQueryを使用している場合、コードは継続する前にクエリが実行されるのを待たないため、出力パラメーターがありません。 OUTパラメーターを取得するには、クエリの実行が終了したときに実行されるAsynccallbackデリゲートを指定する必要があります。また、Beginexecutenonqueryは非常に速く、パフォーマンスの増加がプロセスがクエリを実行するのを待っていないという理由だけではないことを確認してください。 Asyncクエリのポイントは、複雑なレポートを作成するなど、長い処理を発射し、後で完了したら何かを実行したい場合です。たとえば、ユーザーにメールを送信してレポートが処理されたことを伝えます。

他のヒント

使用するとき 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));

したがって、結果は1回だけ適切に利用可能です IsCompleted 本当です。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top