【问题标题】:Executing SQL Stored Procedure with Output Parameter from Entity Framework使用实体框架的输出参数执行 SQL 存储过程
【发布时间】:2014-03-30 20:29:06
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 您是否尝试过使用: var result = this.etlContext.Database.SqlQuery("EXEC dbo.up_GetJobStatus {0}", param.Value)?;
  • 试过了 - 没用
  • 你有什么例外吗?还是只是返回 null?
  • 您看过这个链接 (msdn.microsoft.com/en-us/library/vstudio/…) 以了解如何操作吗?您首先需要将存储过程导入到您的 dbmx

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


【解决方案1】:
  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

  1. 从 C# 代码调用存储过程

    // Type is System.Data.Entity.Core.Objects.ObjectParameter
    ObjectParameter myOutputParamBool = new ObjectParameter("myOutputParamBool", typeof(bool));
    ObjectParameter myOutputParamString = new ObjectParameter("myOutputParamString", typeof(string));
    ObjectParameter myOutputParamInt = new 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);
    

【讨论】:

  • 我确实有表类型作为我的参数给 SP,所以如果我按照你的方式,它们不会作为参数出现在 sp,请建议
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    使用以下代码。它对我有用。

    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】:

      只是以 vicky 的回答为基础。

      var localPar = new SqlParameter("@userlogin", ad);
      var Paramater2 = new SqlParameter("@Paramater2", "");
      Paramater2.Direction = ParameterDirection.Output;
      Paramater2.Size = 30;
      Paramater2.DbType = DbType.String;
      
      var parameters = new List<SqlParameter>();
      parameters.Add(localPar);
      parameters.Add(Paramater2);
      
      
      var result = this.Database.SqlQuery<object>("EXEC dbo.uspSP @userlogin, @Paramater2 =@Paramater2 OUTPUT", parameters.ToArray());
      
      var x = result.FirstOrDefault();
      
      return Paramater2.Value.ToString();
      

      如果您有超过 1 个参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-31
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2016-12-26
        • 2016-12-28
        • 2015-06-05
        相关资源
        最近更新 更多