2010-09-17 75 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