KDr*_*ske 19 sql-server ef-code-first entity-framework-4.1
我正在创建一个需要与遗留代码接口的新应用程序:(.
我试图调用的存储过程使用RETURN作为结果.我尝试执行和使用返回值会导致异常:
InvalidOperationException:执行命令时,参数必须是数据库参数或值.
不希望更改存储过程以另一种方式返回值,因为它要么需要更新遗留应用程序,要么维护几乎重复的存储过程.
遗留存储过程简介:
DECLARE @MyID INT
INSERT INTO MyTable ...
SELECT @MyID = IDENTITY()
RETURN @MyID
Run Code Online (Sandbox Code Playgroud)
我的实体框架/ DbContext工作,产生上述InvalidOperationException.
SqlParameter parm = new SqlParameter() {
ParameterName = "@MyID",
Direction = System.Data.ParameterDirection.ReturnValue
};
DbContext.Database.ExecuteSqlCommand("EXEC dbo.MyProc", parm);
Run Code Online (Sandbox Code Playgroud)
寻找任何和所有不需要修改存储过程的解决方案.
Jef*_*ata 31
您可以将存储过程的返回值捕获到输出参数中:
SqlParameter parm = new SqlParameter() {
ParameterName = "@MyID",
SqlDbType = SqlDbType.Int,
Direction = System.Data.ParameterDirection.Output
};
Database.ExecuteSqlCommand("exec @MyId = dbo.MyProc", parm);
int id = (int)parm.Value;
Run Code Online (Sandbox Code Playgroud)
KDr*_*ske -4
我确信这不是唯一有效的答案,但我最终使用了并且一直成功工作。
关键似乎是将 ReturnValue 参数命名为RetVal。
SqlParameter id = create.Parameters.Add("RetVal", System.Data.SqlDbType.Int);
id.Direction = System.Data.ParameterDirection.ReturnValue;
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
SqlCommand proc = new SqlCommand("dbo.MyProc", new SqlConnection(<connection string>));
proc.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter id = create.Parameters.Add("RetVal", System.Data.SqlDbType.Int);
id.Direction = System.Data.ParameterDirection.ReturnValue;
proc.ExecuteNonQuery();
int newId = Convert.ToInt32(id.Value);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34543 次 |
| 最近记录: |