Sql server SQLCLR中的数据访问模式

Sql server SQLCLR中的数据访问模式,sql-server,data-access-layer,sqlclr,Sql Server,Data Access Layer,Sqlclr,我在我的项目中使用SQLCLR,我对它非常满意。然而,我找不到任何好的数据访问模式的信息源 通常我使用存储过程在.net和SQL之间进行通信,因为我总是希望数据库有一个API。但是,在本例中,.net代码是API的一部分,因此SP看起来很糟糕 虽然可以通过执行DBA不喜欢的操作来安装Linq2SQL,但SQL server中不存在Linq2SQL,因此它不是一个选项 目前我的代码中充斥着标准的ADO.NET代码,比如 using (SqlCommand cmd = c.CreateCommand

我在我的项目中使用SQLCLR,我对它非常满意。然而,我找不到任何好的数据访问模式的信息源

通常我使用存储过程在.net和SQL之间进行通信,因为我总是希望数据库有一个API。但是,在本例中,.net代码是API的一部分,因此SP看起来很糟糕

虽然可以通过执行DBA不喜欢的操作来安装Linq2SQL,但SQL server中不存在Linq2SQL,因此它不是一个选项

目前我的代码中充斥着标准的ADO.NET代码,比如

using (SqlCommand cmd = c.CreateCommand()) {
    cmd.CommandText = "SELECT ... FROM ...";
    using (SqlDataReader rdr = cmd.ExecuteReader()) {
        DoSomething(rdr);
    }
}
而且,尽管它是有效的,但它似乎是一种错误的方式


其他人是如何做到的?

我使用XSLT为DAL生成C代码。我通常从数据库定义本身加载XML,例如选择名称、类型、长度等的某种形式。。。从sys.columns JOIN sys.tables到XML PATH JOIN sys.types,我开发了用于代码生成的定制XSLT转换。我将它们作为VisualStudio构建过程本身的一部分添加,类似于本博客:该博客是关于性能计数器的概述,但它同样适用于DAL代码。我还使用XSLT代码gen为结果集构建类型

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

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


我只想用LINQ来权衡这种方法,因为传递IQueryable对象具有附加值。但是在SQLCLR中,正如您所知,这还不是一个可行的选择。

对于SQLCLR实际提供的性能优于正确的基于集合的TSQL的有限位置,我确实按照上面所示的方式进行数据访问。要真正使用SQLCLR,您必须执行一些非常繁重的基于循环的处理,而这些处理无法完成基于集合、XML解析或极其复杂的数学运算。如果您只是为了数据访问而使用SQLCLR,那么这样做是以性能为代价的。如果您想对此进行一些演示,请告诉我,我将从去年的演示中提取AdventureWorks的示例。

我对SQLCLR的主要用途是使用某些表中的元数据从DSL生成SQL。在T-SQL中这样做会非常麻烦。我的问题与性能无关,但与可维护性和一般良好风格有关。如果您在SQLCLR中动态构建生成的TSQL,您可以在TSQL中执行相同的操作,并使用sp_executesql在TSQL中通过参数化调用它。在这种情况下,对于相同的操作,sp_executesql的性能将比等效的SQLCLR快,并且代码应该同样易于管理。SQLCLR是一个很好的提高性能的工具,但是对于只执行数据访问操作的任务,它也可以很容易地降低性能成本,尽管您可能会考虑更友好的代码管理性。请参阅Erland Sommarskog关于动态SQL的文章,该文章涵盖如何在TSQL中使用动态代码来实现这样的复杂性:@乔纳森:如果您碰巧有T-SQL的ANTLR运行时,我可能会考虑它。非SQLCLR,但我的解决方案依赖于System.Core中定义的表达式树来生成where子句。如何生成where子句?到目前为止,我从未需要生成复杂的where表达式。我总是通过其中一个键和简单的查找方法查找项目,其中key@value是从XSLT生成的。从您对Jonathan的回答来看,您需要在运行时而不是在编译时执行某些操作。不,在本例中,我对那些简单的查询感兴趣,以查找我在复杂逻辑中使用的元数据。这是我最终做得很好的部分,不是XSLT,而是T4模板。我希望有一天我能将我的解决方案开源。就目前而言,我想恰当的回答是没有好的、标准的方法,这基本上就是这个答案所说的。