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

私のクラスは(microsftエンタープライズライブラリにあります):

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

結果はストアドプロシージャの実行のroweffectedですが、@ 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;の2つの実装があります。AddInParameter1つは、とを使用してパラメータを手動で構成するものでAddOutParameter、もう1つは配列を渡すだけです。質問を正しく理解していれば、最初のアプローチは機能しますが、2番目のアプローチは機能しません。そして、冗長性の少ない2番目のアプローチでそれを機能させる方法を知りたいと思います。

私のアドバイス:しないでください。詳細コードは機能します。さらに、正しい理由で機能します。特に、常に優先されるインデックス渡しではなく、名前渡しを使用しています。

しかし、私の最大の質問は、なぜエンタープライズライブラリなのかということです。-これは、生の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 に答える