C#
Window Serviceからストアド プロシージャを実行しています。ストアド プロシージャは非常に重いクエリであり、かなり長い時間がかかります。
ストアド プロシージャが終了して値を返すまで待ちたいと思います。
ストアド プロシージャが終了したことを確認する方法はありますか?
C#
Window Serviceからストアド プロシージャを実行しています。ストアド プロシージャは非常に重いクエリであり、かなり長い時間がかかります。
ストアド プロシージャが終了して値を返すまで待ちたいと思います。
ストアド プロシージャが終了したことを確認する方法はありますか?
を使用し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
}
}
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;
}
ストアド プロシージャで 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;
......................
.........