2010-09-17 70 views
4

忽略ORM/NHibernate等。考慮傳遞唯一ID並從單行返回數據(如果找到ID)的常見要求。執行此操作的兩種方法是返回記錄集或使用輸出參數。存儲過程將從.NET C#代碼調用 - 因此從這個角度來看,需要使用ExecuteNonQuery設置/讀取附加參數,而另一個需要ExecuteScalar和訪問/讀取DataReader。Stored Proc返回一行,記錄集或輸出參數?

是否有過使用一個VS其他任何實際的好處?

CREATE PROC GetUserByRecordSet 
    @UserID UniqueIdentifier 
AS 
BEGIN 
    SELECT 
     ID, 
     Name, 
     EmailAddress 
    FROM 
     [User] 
    WHERE 
     id = @UserID 
END 
GO 

CREATE PROC GetUserByOutputParams 
    @UserID UniqueIdentifier, 
    @Name NVARCHAR(255) OUTPUT, 
    @EmailAddress NVARCHAR(500) OUTPUT 
AS 
BEGIN 
    SELECT 
     @Name =Name, 
     @EmailAddress = EmailAddress 
    FROM 
     [User] 
    WHERE 
     id = @UserID 
END 
GO 
+0

我想我應該補充的評論,我總是者優先記錄方式,但只是因爲這是我原來學的方式。我可以看到的這種方法的一個好處是它抽象了底層的數據類型/大小。如果名稱在表內增加了大小,則需要在所有引用的地方修改輸出參數。 – 2010-09-17 10:37:59

回答

3

這兩種方法之間的主要區別是靈活性。如果要更改返回的列,則更改返回記錄集的過程的工作量會減少。

-2

如果你只返回用戶的ID,爲了讓您的ORM需要做的另一往返數據庫以獲取有關該用戶的其他信息的用戶信息。

我只想建立正確映射你的實體,您的SQL表,並獲得所有必要的字段之間,而不是返回的ID。

但假設我們有一個程序,返回數百名ID的,你一定不希望你做的基於ID的數據的一些複雜的過濾返回整個它的記錄。所以,ymmv。

+0

我並不是真的這個答案是被問及給出的例子。它傳遞一個唯一的ID並返回與該記錄相關的(有限)數據。我問的是,更好的方法,記錄集或輸出參數,純粹是關於給出的例子。 – 2010-09-17 10:40:18

+0

@保羅哈德菲爾德,兩個第一句話處理你的問題。第三個是關於在其他情況下要記住的內容。同樣,如果你有一個與數據庫同步的ORM,並且已經緩存了流行實體的數據,那麼你可以返回ID,否則你最好返回所有必要的字段。 – 2010-09-17 10:45:53