使用实体框架中的输出参数执行SQL存储过程

时间:2014-02-27 12:05:58

标签: c# sql entity-framework stored-procedures entity-framework-4

使用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方法,但这也没有用。

有什么想法吗?

5 个答案:

答案 0 :(得分:13)

  1. 在数据库中创建存储过程

    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
    
  2. 从数据库更新实体模型以包含存储过程 as shown here

  3. 从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);
    

答案 1 :(得分:4)

这是一个实际答案。显然,当您首先使用DbContext /代码时,实体框架中的输出参数存在严重问题。本文有一个很好的讨论和解决方法:http://weblogs.asp.net/dwahlin/using-entity-framework-code-first-with-stored-procedures-that-have-output-parameters。显然它应该被更新“修复”,但我还没有真正看到过这种情况。

答案 2 :(得分:1)

请查看this链接以执行存储过程并检索输出参数。您首先需要将存储过程导入dbmx。

答案 3 :(得分:1)

用户使用下面的代码在我这边工作。

            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,第二个@JobStatus是PROCEDURE参数名称。

答案 4 :(得分:0)

只是基于维基的答案。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.19.0/TweenMax.min.js">
<script src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/DrawSVGPlugin.min.js">

如果您有多个参数。