0

目的:単一の関数呼び出しを介して asp.net Web ページのコード ビハインドから非常に遅いストアド プロシージャ (パラメーター付き) を非同期的に呼び出し、それを忘れます。

注:SqlCommand.BeginExecuteNonQuery呼び出しを行わずに使用しようとしましたがSqlCommand.EndExecuteNonQuery(以下のコードを参照)、ストアド プロシージャは実行されませんでした。(小さなストアド プロシージャを使用して、テスト用にテーブルの単一フィールドを更新しましたが、フィールドは更新されませんでした。使用すると更新されますSqlCommand.ExecuteNonQuery)。

私は興味がなく、ストアド プロシージャがいつ終了するかわかりません。(だから、呼び出しが終わるのが待ちきれないSqlCommand.EndExecuteNonQuery。)

状況: 調査の結果、SQL ジョブをこの目的に使用できることがわかりました。そしてspパラメータについて; それらをテーブルに格納してから、sp で読み取ることができます。ただし、これが私の問題に対する正しいアプローチであるかどうかはわかりません (SQL の世界は初めてです)。この目的でのSQLジョブの使用についてコメントするか、代替案を提案していただければ幸いです。ありがとう。

コード:

    using (SqlConnection connection = new SqlConnection(
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True"
        + ";Asynchronous Processing=true"))
    {
        connection.Open();
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString()));
        cmd.BeginExecuteNonQuery(); //Doesn't work.
        //cmd.ExecuteNonQuery(); // This works.
    }
4

3 に答える 3

0

spを別のスレッドで実行するだけでよいと思います。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2011-11-13T14:27:38.423 に答える
0

asp.net のコード ビハインドからこれを行う方法を探していましたが、簡単な方法がないことに気付きました (接続やタイムアウトの問題については考えたくありませんでした)。結局、Webサービスを介してそれを行いました。

  1. asp.net コード ビハインドから、Web サービスの関数を同期的に呼び出します。
  2. Web サービスの関数内で、を使用してストアド プロシージャを非同期SqlCommand.BeginexecuteNonQuery(AsyncCallback, Object)的に呼び出します。
  3. コールバックは Web サービス内で処理されます (エラー処理用)。

したがって、私の Web ページは私が望むように動作し続けます: リクエストを一度起動したら、それを忘れてください。

于 2011-11-16T13:09:33.027 に答える
0

たとえば、ThreadPool を使用して、別のスレッドで同期呼び出しを行います。

それは次のようになります...

抽出方法:

private void ExecuteCommandSync()
{
    using (SqlConnection connection = new SqlConnection( 
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True" 
        + ";Asynchronous Processing=true")) 
    { 
        connection.Open(); 
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString())); 
        cmd.ExecuteNonQuery(); 
    }
}

コードを変更してください:

ThreadPool.QueueUserWorkItem((x) => { ExecuteCommandSync(); });

完了すると、ThreadPool からのスレッドで同期呼び出しが行われます。接続が閉じられ、完了です。Stored Proc を待機している間、スレッドがスリープ状態になるため、これはパフォーマンスの点で最良のソリューションではありませんが、十分に優れており、必要なことを実行します。

于 2011-11-13T14:58:49.297 に答える