返回强类型存储过程结果

Posted

技术标签:

【中文标题】返回强类型存储过程结果【英文标题】:Returning strongly typed stored procedure results 【发布时间】:2011-04-30 23:12:53 【问题描述】:

目前,如果我们想从数据库中获取记录列表,我们的 DAL 会返回一个 DataTable 给我们的业务层,然后业务层会返回相同的 DataTable 给我们的调用接口(在本例中是一个 asp.vb 页面)。

但是我不认为我们应该从 BLL 返回一个 DataTable,我一直认为基于存储过程中的字段返回一个强类型集合会更好 例如

public Class MyCustomType
    public customerId as int32
    public name as string
end Class

public function GetCustomers() as Generic.ICollection(Of MyCustomType)
    //call to DAL here
end function

实现这一点的最佳方法是遍历我们的 DataTable,并为每个 DataRow 创建一个新的 MyCustomType 对象并将其添加到集合中,然后返回集合吗?

谢谢。

【问题讨论】:

【参考方案1】:

您的设计似乎试图分离职责但中途停止。将像 DataTable 这样模糊的东西返回到您的表示层隐含地将其与数据源的特定模式知识耦合。最有可能的是,DataTable 包含演示文稿甚至不需要的信息。处理 BLL 中的细节并将强类型的有目的的对象返回到您的 PL 与您已经尝试设计的模型更加一致。

【讨论】:

【参考方案2】:

这是一个实用程序的链接,它可以帮助将 DataTable 映射到 MyCustomType 对象:

http://www.eggheadcafe.com/articles/20040221.asp

它有点旧,但可能会有所帮助。也许还有其他一些工具,例如 AutoMapper。

【讨论】:

我下载了 AutoMapper,尽管它使用反射而不是属性属性,但它比文章中的示例快得多。谢谢。【参考方案3】:

在我工作的地方,我们就是这样做的。在我们的例子中,我们得到一个DataReader 并手动填充类实例的字段。我们还从List<MyClass> 派生了一个新的列表类型来配合它。确保您正确检查 DBNull.Value 和正确的转换等等。

【讨论】:

以上是关于返回强类型存储过程结果的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL的存储过程如何返回查询到的行数据?

如何在存储过程中直接使用另一个存储过程返回的数据集

Entity Framework 6 中具有多个记录集的存储过程

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

如何返回sqlserver 中存储过程的select的结果集