如何从企业库(c#)中的ExecuteNonQuery中获取输出参数值
本文关键字:ExecuteNonQuery 获取 输出 参数 中的 企业库 | 更新日期: 2023-09-27 17:57:49
我的存储过程是:
create Procedure spSetUser
(
@Name NVarchar(50),
@OrganicTitle NVarchar(30),
@UserName NVarchar(20),
@Password NVarchar(16),
@Result Int Output
)
As
Begin
Set @Result = -1
If Not Exists(Select UserId From dbo.Users Where UserName=@UserName)
Begin
Insert Into dbo.Users (Name,OrganicTitle,UserName,[Password])
Values(@Name,@OrganicTitle,@UserName,@Password)
Set @Result = SCOPE_IDENTITY()
End
Return
End
Go
我的课程是(在microsoft企业库中):
[DataObjectMethod(DataObjectMethodType.Insert)]
public Int32 SetUser(UserFieldSet Data)
{
Int32 Result = 0;
object[] values = new object[] { Data.Name, Data.OrganicTitle, Data.UserName, Data.Password, Data.UserId };
Result = Db.ExecuteNonQuery("spSetUser", values);
return Result;
}
结果是执行存储过程的roweffect,但我想得到@Result(过程的输出参数)的值,我如何才能得到它?
UserFieldClass为:
public class UserFieldSet
{
public Int32 UserId;
public String Name;
public String OrganicTitle;
public String UserName;
public String Password;
}
提示:我知道必须使用这个代码才能获得@Result:
public Int32 SetUser(UserFieldSet Data)
{
Int32 Result = 0;
DbCommand DbCmd = Db.GetStoredProcCommand("spSetUser");
Db.AddInParameter(DbCmd, "@Name", DbType.String, Data.Name);
Db.AddInParameter(DbCmd, "@OrganicTitle", DbType.String, Data.OrganicTitle);
Db.AddInParameter(DbCmd, "@UserName", DbType.String, Data.UserName);
Db.AddInParameter(DbCmd, "@Password", DbType.String, Data.Password);
Db.AddOutParameter(DbCmd, "@Result", DbType.Int32, Int32.MaxValue);
Db.ExecuteNonQuery(DbCmd);
Result = (Int32)Db.GetParameterValue(DbCmd, "@Result");
return Result;
}
但我可以用这种方法得到它:
Result = Db.ExecuteNonQuery("spSetUser", values);
您是否尝试过使用ExecuteScalar?
在阅读问题时,您有两个SetUser
的实现;一个是使用AddInParameter
和AddOutParameter
手动配置参数,另一个是只传递数组。如果我正确理解这个问题,第一种方法有效,第二种方法无效。您想知道如何使用不那么冗长的第二种方法使其工作。
我的建议是:不要。详细代码的工作原理等等:它的工作原理是正确的——特别是,它使用的是按名称传递,而不是按索引传递,这应该始终是首选。
不过,我最大的问题是:为什么是企业库-与原始ADO.NET相比,它添加的内容很少。如果我想方便,我可能会考虑"dapper",但即使有了这个out
参数也有点麻烦:
var args = new DynamicParameters(
new { Data.Name, Data.OrganicTitle, Data.UserName, Data.Password});
// note: ^^ are actually specifying implicit names
args.Add("Result", direction: ParameterDirection.Output);
connection.Execute("spSetUser", args, commandType: CommandType.StoredProcedure);
return args.Get<int>("Result");
通常情况下这要容易一些;例如:
connection.Execute("spFoo", new { id = -1, name },
commandType: CommandType.StoredProcedure);