8

我的存储过程是:

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

我的课是(在微软企业库中):

[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;
}

结果是执行存储过程的行影响,但我想获取@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);
4

2 回答 2

3

您是否尝试过使用 ExecuteScalar 代替?

于 2013-02-06T10:31:30.170 回答
1

当我阅读这个问题时,您有两个实现SetUser;一种使用AddInParameterand手动配置参数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);
于 2013-02-06T10:46:31.753 回答