2013-02-06 30 views
7

thủ tục lưu trữ của tôi là:Cách lấy giá trị tham số đầu ra từ ExecuteNonQuery trong thư viện doanh nghiệp (C#)?

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 

và lớp học của tôi là (trong thư viện doanh nghiệp 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; 
} 

Kết quả được roweffected của thực hiện thủ tục lưu trữ, nhưng tôi muốn có được giá trị của @Result (đầu ra tham số của thủ tục), Làm thế nào tôi có thể nhận được nó?

UserFieldClass là:

public class UserFieldSet 
{ 
    public Int32 UserId; 
    public String Name; 
    public String OrganicTitle; 
    public String UserName; 
    public String Password; 
} 

Mẹo: Tôi biết phải sử dụng mã này để có được @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; 
} 

Nhưng tôi có thể lấy nó với methd này:

Result = Db.ExecuteNonQuery("spSetUser", values); 
+0

Bạn đã thử nhìn vào 'giá trị [4]' sau cuộc gọi chưa? nó có được cập nhật không? mặc dù: nó cũng có thể được rằng khi sử dụng chữ ký đó, tất cả các tham số được thêm vào như là đầu vào chỉ. –

Trả lời

3

Bạn đã thử sử dụng ExecuteScalar thay thế chưa?

+0

ExecuteScalar có thể hữu ích nếu bạn sau một giá trị 'select' đơn; Tôi sẽ không mong đợi nó thay đổi tham số 'out' xử lý bất kỳ –

+1

Vui lòng cập nhật mã của tôi, tôi muốn chèn dữ liệu vào bảng của mình và nhận giá trị của userid. Làm thế nào tôi có thể? –

+0

Bạn có làm việc này không? Tôi đang làm điều tương tự bạn đang và cũng đã thay đổi nó để sử dụng vô hướng thực thi, nhưng vẫn tham số ra là trống. Nếu bạn có điều này để làm việc, bạn sẽ vui lòng chia sẻ những gì bạn đã làm. Cảm ơn! – ptn77

1

Khi tôi đọc câu hỏi, bạn có hai triển khai là SetUser; một cấu hình các thông số theo cách thủ công bằng cách sử dụng AddInParameterAddOutParameter và một thông số chỉ truyền một mảng. Nếu tôi hiểu câu hỏi một cách chính xác, phương pháp tiếp cận đầu tiên hoạt động, và phương pháp thứ hai thì không. Và bạn muốn biết cách làm cho nó hoạt động với cách tiếp cận thứ hai tiết kiệm hơn.

Lời khuyên của tôi: không. Mã chi tiết hoạt động và hơn thế nữa: nó hoạt động vì những lý do đúng - đặc biệt, nó sử dụng tên theo từng tên, thay vì truyền theo chỉ mục, nên luôn được ưu tiên.

Câu hỏi lớn nhất của tôi là: tại sao thư viện doanh nghiệp? - bổ sung rất ít so với ADO.NET thô. Nếu tôi muốn tiện, tôi muốn có thể được xem xét "đoan trang", nhưng ngay cả với điều này out thông số là một chút của một 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"); 

thường nó là một chút dễ dàng hơn đó; ví dụ:

connection.Execute("spFoo", new { id = -1, name }, 
     commandType: CommandType.StoredProcedure); 
Các vấn đề liên quan