2013-02-06 30 views
7

我的存儲過程是:如何從企業庫(c#)中的ExecuteNonQuery獲取輸出參數值?

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 [email protected]) 
    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); 
+0

您是否嘗試過在調用之後查看'values [4]'?它會被更新嗎?儘管:使用該簽名時很可能會將所有參數僅作爲輸入添加。 –

回答

3

你有沒有嘗試過使用ExecuteScalar?

+0

如果你在一個'select'值之後,ExecuteScalar可能會很有用;我不希望它改變處理任何 –

+1

的'out'參數請更新我的代碼,我想插入數據到我的表並獲得userid的價值。我怎麼能? –

+0

你是否得到這個工作?我正在做同樣的事情,並將其更改爲使用執行標量,但out參數仍爲空。如果你有這個工作,請分享你的工作。謝謝! – ptn77

1

當我讀到這個問題時,你有兩個實現SetUser;一個使用AddInParameterAddOutParameter手動配置參數,另一個只是傳遞一個數組。如果我正確地理解了這個問題,第一種方法就行得通,而第二種方法不行。而且你想知道如何使用較不詳細的第二種方法進行工作。

我的建議:不要。詳細代碼工作,以及更多:它適用於正確的原因 - 特別是它使用傳遞名稱,而不是傳遞索引,它應該始終是首選。

但我最大的疑問是:爲什麼企業庫? - 與原始ADO.NET相比,增加了很少。如果我想方便,我可能會在看「短小精悍」,但即使有這樣的out參數是有點faff的:

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);