2009-10-07 35 views
0

我在我的項目中使用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); 
    } 
} 

,雖然,它的工作原理,它只是似乎很喜歡錯誤的方式來做到這一點。

其他人怎麼做到的?

回答

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代碼gen爲結果集創建類型。

雖然在重型客戶端上,這種方法與ORM和ADO數據集功能(我仍然在這些客戶端上使用它,但這是我的問題...),在SQLCR中是最好的,由於SQLCLR的具體限制。當我對代碼庫(沒有外部依賴關係,沒有外部引入的錯誤)​​進行絕對控制時,允許我快速進行影響每個DAL入口點的全局更改。與ADO數據集相比,它極輕巧。

我只會權衡這種方法的LINQ,因爲周圍路過的IQueryable對象的附加值。但是在SQLCLR中,如你所知,這還不是一個可行的選擇。

+0

其實我做的是幾乎相同的自己在非SQLCLR,但我的解決方案是依賴於表達式樹(這是在System.Core程序定義)來生成where子句。你如何生成你的where子句? – erikkallen 2009-10-08 09:39:06

+0

到目前爲止,我從不需要生成複雜的表達式。我總是通過其中一個鍵查找項目,並從XSLT生成簡單的查找方法(WHERE key @ value)。從你對喬納森的回答來看,你在運行時需要一些東西,而不是在編譯時。 – 2009-10-08 15:15:52

+0

不,在這種情況下,我對這些簡單查詢感興趣,查找我在複雜邏輯中使用的元數據。 – erikkallen 2009-10-09 18:54:06

0

對於SQLCLR實際上提供了基於組適當的TSQL性能提升有限的地方,我做的正是你怎麼在上面顯示它的數據訪問。你必須做一些非常繁重的基於循環的處理,不能基於集合,XML解析或者非常複雜的數學來真正需要使用SQLCLR。如果您僅將SQLCLR用於數據訪問,那麼就是以犧牲性能爲代價。如果你想要一些示範讓我知道,我會從去年的演講中拿出AdventureWorks的例子。

+0

我對SQLCLR的主要用途是使用某些表中的元數據從DSL生成SQL。這在T-SQL中非常麻煩。我的問題與性能無關,但與可維護性和一般良好風格有關。 – erikkallen 2009-10-08 09:35:54

+0

如果您在SQLCLR中動態構建生成的TSQL,則可以在TSQL中執行相同的操作,並使用sp_executesql在TSQL中使用參數化來調用它。在這種情況下,對於相同的操作,sp_executesql的性能將比等效的SQLCLR更快,並且代碼應該可以管理。 SQLCLR是增加性能的一個很好的工具,但它也可以輕鬆地爲僅執行數據訪問操作的任務犧牲性能,儘管您可能認爲「更友好」的代碼可管理性是明智的。 – 2009-10-09 04:49:37

+0

查看Erland Sommarskog關於動態SQL的文章,其中介紹瞭如何在TSQL中使用動態代碼來完成如下複雜性: http://www.sommarskog.se/dynamic_sql.html – 2009-10-09 04:53:43