EFを使用して、単一の文字列値(SQLエージェントジョブのステータス)を返すストアドプロシージャを実行しようとしています。
ストアドプロシージャは次のように宣言されています
CREATE PROCEDURE [dbo].[up_GetJobStatus](@JobStatus NVARCHAR(30) OUTPUT)
AS
-- some code omitted for brevity
SELECT @JobStatus = (
SELECT
CASE job_state
WHEN 1 THEN 'Executing'
WHEN 2 THEN 'Waiting for thread'
WHEN 3 THEN 'Between retries'
WHEN 4 THEN 'Idle'
WHEN 5 THEN 'Suspended'
WHEN 6 THEN '<unknown>'
WHEN 7 THEN 'Performing completion actions'
END
FROM @xp_results results
INNER JOIN msdb.dbo.sysjobs sj
ON results.job_id = sj.job_id
WHERE sj.job_id = @job_id)
RETURN
クエリウィンドウで実行できるため、ストアドプロシージャが正しく機能していることを確認しました。
@JobStatus
------------
1|Idle
ただし、EFで実行する場合、パラメーター値はNULLです
var param = new SqlParameter
{
ParameterName = "@JobStatus",
DbType = DbType.String,
Size = 30,
Direction = System.Data.ParameterDirection.Output
};
var result = this.etlContext.Database.SqlQuery<string>("EXEC dbo.up_GetJobStatus @JobStatus OUTPUT", param);
私もExecuteSqlCommand
メソッドを試しましたが、それもうまくいきませんでした。
何か案は?
データベースにストアドプロシージャを作成する
CREATE PROCEDURE [dbo].myStoredProcName
@inputParam1 VARCHAR(150),
@inputParam2 VARCHAR(150),
@myOutputParamBool BIT OUTPUT,
@myOutputParamString VARCHAR(100) OUTPUT,
@myOutputParamInt INT OUTPUT
AS
BEGIN
-- sql here
END
エンティティモデルをデータベースから更新してストアドプロシージャを含める ここに示すとおり
C#コードからストアドプロシージャを呼び出す
System.Data.Entity.Core.Objects.ObjectParameter myOutputParamBool=new System.Data.Entity.Core.Objects.ObjectParameter("myOutputParamBool",typeof(bool));
System.Data.Entity.Core.Objects.ObjectParameter myOutputParamString=new System.Data.Entity.Core.Objects.ObjectParameter("myOutputParamString",typeof(string));
System.Data.Entity.Core.Objects.ObjectParameter myOutputParamInt=new System.Data.Entity.Core.Objects.ObjectParameter("myOutputParamInt",typeof(Int32));
using (var context = new SandCryptEntities())
{
context.myStoredProcName(inputParam1, inputParam2, myOutputParamBool, myOutputParamString, myOutputParamInt);
}
bool myBool = Convert.ToBoolean(myOutputParamBool.Value);
string myString = Convert.ToString(myOutputParamString.Value);
int myInt = Convert.ToInt32(myOutputParamInt.Value);
これが実際の答えです。最初にDbContext/codeを使用している場合、エンティティフレームワークの出力パラメーターに深刻な問題があるようです。この記事には良い議論と回避策があります: http://weblogs.asp.net/dwahlin/using-entity-framework-code-first-with-stored-procedures-that-have-output-parameters =。どうやら、それはアップデートで「修正」されるはずですが、私はそれが実際に起こるのを見ていません。
それは私の側で働いている次のコードを使用してください。
var param = new SqlParameter
{
ParameterName = "@JobStatus",
DbType = DbType.String,
Size = 30,
Direction = System.Data.ParameterDirection.Output
};
var result = this.etlContext.Database.SqlQuery<string>("EXEC dbo.up_GetJobStatus @JobStatus=@JobStatus OUTPUT", param);
string JobStatus = param.Value.ToString();
最初の@JobStatusはパラメーターParameterNameで、2番目の@JobStatusはPROCEDUREパラメーター名です。