0

我在我的项目中使用了 SQLCLR,并且,为了记录,我对它非常满意。但是,对于良好的数据访问模式,我找不到任何好的信息来源。

通常我使用存储过程在 .net 和 SQL 之间进行通信,因为我总是想要一个用于我的数据库的 API。但是,在这种情况下,.net 代码是 API 的一部分,因此 SP 看起来很糟糕。

SQL server 中不存在 Linq2SQL(尽管它可以通过 DBA 不喜欢的方式安装),所以它不是一个选项。

我目前拥有的是我的代码与标准 ADO.NET 代码一样混乱

using (SqlCommand cmd = c.CreateCommand()) {
    cmd.CommandText = "SELECT ... FROM ...";
    using (SqlDataReader rdr = cmd.ExecuteReader()) {
        DoSomething(rdr);
    }
}

而且,尽管它有效,但它似乎非常像错误的方法。

其他人是如何做到的?

4

2 回答 2

1

我使用 XSLT 为 DAL 生成 C# 代码。我通常从数据库定义本身(例如某种形式的SELECT name, type, length, ... FROM sys.columns JOIN sys.tables JOIN sys.types FOR XML PATH)加载 XML,并且我已经及时开发了用于代码生成的自定义 XSLT 转换。我将它们添加为 Visual Studio 构建过程本身的一部分,类似于此博客:http ://rusanu.com/2009/04/11/using-xslt-to-generate-performance-counters-code/ (博客是关于性能计数器的生成,但它也适用于 DAL 代码)。我还使用 XSLT 代码生成器为结果集构建类型。

虽然在重型客户端上,这种方法与 ORM 和 ADO 数据集功能重叠(我仍然在这些客户端上使用它,但这是我的问题......),由于 SQLCLR 的特定限制,SQLCR 是最合适的。

这种方法首先非常灵活,允许我快速进行影响每个 DAL 入口点的全局更改,同时我对代码库保持绝对控制(没有外部依赖项,没有外部引入的错误)​​。与 ADO 数据集相比,它非常轻量级。

由于传递 IQueryable 对象的附加值,我只会为 LINQ 权衡这种方法。但如您所知,在 SQLCLR 中,这还不是一个可行的选择。

于 2009-10-07T21:22:31.657 回答
0

对于 SQLCLR 实际上比基于适当集合的 TSQL 提供性能增益的有限地方,我完全按照您上面显示的方式进行数据访问。您必须进行一些非常繁重的基于循环的处理,而这些处理无法基于集合、XML 解析或极其复杂的数学运算才能真正需要使用 SQLCLR。如果您仅将 SQLCLR 用于数据访问,那么您这样做是以牺牲性能为代价的。如果您想对此进行一些演示,请告诉我,我将从去年的演示文稿中提取 AdventureWorks 的示例。

于 2009-10-08T01:32:02.850 回答