为什么在EF ExecuteSqlCommand调用中SQL Server字符串输出参数返回0?

时间:2018-08-02 16:40:46

标签: c# sql-server entity-framework

我在C#中有此代码,我想在我的代码中使用字符串sReturn作为输出参数。

var sReturn = new SqlParameter();
sReturn.ParameterName = "@Return";
sReturn.SqlDbType = SqlDbType.VarChar;
sReturn.Size = 300;
sReturn.Direction = ParameterDirection.Output;

string query = "exec @Return = sqlServerProcedure @id, @dateBegin, @dateEnd";

_context.Database.CommandTimeout = timeout;
_context.Database.ExecuteSqlCommand
            (query, sReturn,
                new SqlParameter("@id", id),
                new SqlParameter("@dateBegin", dateBegin),
                new SqlParameter("@dateEnd", dateEnd) );
 return sReturn.Value;

sReturn始终返回0。

过程如下:

CREATE PROCEDURE [dbo].sqlServerProcedure 
     (@dateBegin DATETIME,
      @dateEnd DATETIME,
      @id NUMERIC)
AS
BEGIN
    SELECT 'some random message'
END

为什么总是返回0?

3 个答案:

答案 0 :(得分:3)

您确实不需要声明@return参数,如果期望过程中有单个值,请使用SQL ExecuteScalar()的{​​{1}}方法。

还可以使用存储过程类型代替内联SQL查询。您的ADO.net代码如下所示,存储过程未更改。

command

答案 1 :(得分:1)

错误出在SQL Server过程中,并且在ExecuteSqlCommand中对其进行了调用。

您必须在C#中执行此操作:

string query = "exec sqlServerProcedure @id, @dateBegin, @dateEnd, @Return OUTPUT";

在SQL Server中:

CREATE PROCEDURE [dbo].sqlServerProcedure 
    (@dateBegin DATETIME,
     @dateEnd DATETIME,
     @id NUMERIC,
     @Return VARCHAR(300) OUTPUT)

答案 2 :(得分:1)

EXECUTE (Transact-SQL)的文档包含以下内容:

  

@return_status   是一个可选的整数变量,用于存储模块的返回状态。在EXECUTE语句中使用此变量之前,必须在批处理,存储过程或函数中声明此变量。

     

用于调用标量值用户定义的函数时,@ return_status变量可以是任何标量数据类型。

由于您正在调用存储过程(不是标量值函数),所以返回值为0(成功),转换为字符串。

如果您使用的是ADO.NET,则可以使用另一个答案中提到的ExecuteScalar。但是EF6 ExecuteSqlCommand方法等效于ADO.NET ExecuteNonQuery,不能用于检索返回的单行单列记录集

执行存储过程并在EF6中获得所需字符串结果的最简单方法是使用EF SqlQuery<string>方法和LINQ FirstOrDefault的组合:

var returnValue = _context.Database
    .SqlQuery<string>("sqlServerProcedure @p0, @p1, @p2", dateBegin, dateEnd, id)
    .FirstOrDefault();