我在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?
答案 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();