SQLCLR中的数据访问模式

时间:2009-10-07 21:11:18

标签: sql-server data-access-layer sqlclr

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

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

Linq2SQL在SQL服务器中不存在(虽然它可以通过DBA不喜欢的事情来安装),所以它不是一个选项。

我目前所拥有的是我的代码混乱了标准的ADO.NET代码,如

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

并且,虽然它有效但看起来非常像是错误的做法。

其他人如何做到这一点?

2 个答案:

答案 0 :(得分:1)

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

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

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

我只会为LINQ换取这种方法,因为传递IQueryable对象的附加价值。但是在SQLCLR中,如你所知,这还不是一个可行的选择。

答案 1 :(得分:0)

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