[英]Executing SQL Stored Procedure with Output Parameter from Entity Framework
使用 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# 代码调用存储过程
// 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);
这是一个实际的答案。 显然,当您首先使用 DbContext/code 时,实体框架中的输出参数存在严重问题。 这篇文章有一个很好的讨论和解决方法: http : //weblogs.asp.net/dwahlin/using-entity-framework-code-first-with-stored-procedures-that-have-output-parameters 。 显然它应该通过更新“修复”,但我还没有真正看到这种情况发生。
请查看此链接以执行存储过程并检索输出参数。 您首先需要将存储过程导入dbmx。
使用以下代码。 它对我有用。
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 参数名称。
只是为了建立在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 个以上的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.