3

C#Window Serviceからストアド プロシージャを実行しています。ストアド プロシージャは非常に重いクエリであり、かなり長い時間がかかります。

ストアド プロシージャが終了して値を返すまで待ち​​たいと思います。

ストアド プロシージャが終了したことを確認する方法はありますか?

4

3 に答える 3

5

を使用しThreading.Tasksます。次のコードは、タスクが終了するまでスレッドを待機させます。

public void CallStoredProcMethod()
{
    var task1 = System.Threading.Tasks.Task.Factory.StartNew(() => RunStoredPro());

    // thread will wait there till the operation finish
    task1.Wait();
}

public void RunStoredPro()
{
    using (var connection = new SqlConnection(sqlConnString))
    {
        // your database call
    }
}
于 2012-09-25T13:46:59.600 に答える
2

System.Data.Common.DbCommandにはCommandTimeoutプロパティがあります。

コマンド実行の試行を終了してエラーを生成するまでの待機時間を取得または設定します。コマンドの実行を待機する秒数。実装者への注意として、0 はタイムアウトなしを意味することをお勧めします。

SqlCommand のデフォルトは 30 秒です。CommandTimeout プロパティを 0 に設定すると、ストアド プロシージャの実行と同じだけ呼び出しに時間がかかります。SqlCommand のExecuteScalar実装の msdn ページには、次の例があり、 CommandTimeoutを設定するためにわずかに変更されています。

static public int AddProductCategory(string newName, string connString)
{
    Int32 newProdID = 0;
    string sql =
        "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
        + "SELECT CAST(scope_identity() AS int)";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);

        // this will cause the command to wait until the sproc is finished
        cmd.CommandTimeout = 0; 

        cmd.Parameters.Add("@Name", SqlDbType.VarChar);
        cmd.Parameters["@name"].Value = newName;
        try
        {
            conn.Open();
            newProdID = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    return (int)newProdID;
}
于 2012-09-25T12:58:17.603 に答える
1

ストアド プロシージャで return ステートメントを使用して値を取得する

たとえば、ストアド プロシージャとして

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Validate]
@inputdata varchar(50),
@outputdata varchar(50) output

AS
SET @outputdata = (
SELECT TOP 1 Password FROM dbo.tblUser WHERE Login = @a)

RETURN @outputdata
GO

ここでは、C# のコア コードについて簡単に説明しています。

       string returnValue = string.Empty;
         ...............
        SqlConn.Open();
        sqlcomm.CommandType = CommandType.StoredProcedure;
        SqlParameter param = new SqlParameter("@inputdata", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = Username;
        sqlcomm.Parameters.Add(param);

        SqlParameter retval = sqlcomm.Parameters.Add("@outputdata", SqlDbType.VarChar);
        retval.Direction = ParameterDirection.Output;
        string retunvalue = (string)sqlcomm.Parameters["@outputdata"].Value;
         ......................
         .........
于 2012-09-25T13:10:38.680 に答える