2012-01-17 102 views
3

我一直在閱讀關於SQL Server中的CLR集成(我正在使用2008 R2,但我相信這與這個問題幾乎沒有關係),並且碰到了CLR UDT的主題。經過一番閱讀後,我發現大多數人認爲他們是邪惡的,反對使用他們的建議,甚至表示他們沒有任何實際的應用。然而,我發現關於CLR UDT的每次討論圍繞使用它們作爲列類型將對象存儲在數據庫中,但我無法找到任何有關嚴格使用它們以緩解應用程序與數據庫通信的任何內容。使用CLR UDT作爲SQL Server存儲過程參數

在完成了很多項目之後,我仍然需要找到一個解決方案,其中一個領域是應用程序層和數據層之間的通信,因此我總是對新方法感興趣。我通常採用的方法是通過存儲過程處理所有數據訪問。然而,有一件事情讓我很煩惱,它不得不在很多地方維護一個對象的屬性列表和相應的表列。舉例來說,如果我有20個物業/列的Product數據對象,我要保持在幾個地方屬性列表:

  • (1X)數據庫表
  • (3次)創建/檢索存儲/更新程序的身體
  • (3×)創建/檢索/更新存儲過程參數列表
  • (3×)的應用程序代碼調用存儲過程(本文位於對象關係映射)
  • (1×)數據對象的類定義

這裏是我看到CLR UDT的一個潛在的非邪惡應用程序:使用CLR UDT我可以使用對象在應用程序和數據庫之間進行通信,並將對象關係映射移動到存儲過程。下面是我的意思的例子:

產品更新存儲過程:

CREATE PROCEDURE crudProductUpdate 
    @Product udtProduct 
AS 
    UPDATE Products 
    SET Name = @Product.Name, 
     Manufacturer = @Product.Manufacturer, 
     Price = @Product.Price, 
     ... 
    WHERE SKU = @Product.SKU 

產品更新應用程序代碼:

void Update() 
{ 
    using (SqlCommand cmd = new SqlCommand("crudProductUpdate", this.DB) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@Product", this); 
     cmd.ExecuteNonQuery(); 
    } 
} 

使用這種方法,我將能夠削減的地方我需要維護物業/專欄名單:

  • (1x)數據庫表
  • (3×)創建/檢索/更新存儲過程的身體(在此位於對象關係映射)
  • (1×)的數據對象的類定義

在紙面上這似乎像一個沒有腦子,但我相信我是短視的,我錯過了這種方法的一些缺點,以及CLR UDT的潛在有用應用。所以,這個問題基本上是:這種方法會產生什麼缺點和/或問題?你會推薦(反對)使用這種方法嗎?

+0

任何人有任何關於這個問題的想法? – MarioVW 2012-09-11 07:51:02

+0

「我發現大多數人發現它們是邪惡的」 - 我猜那些人不會使用「geography」或「geometry」類型,因爲那些是CLR類型。 – 2012-09-11 07:57:59

回答

2

我可以看到至少兩個間接缺點:

  • 這真的綁整個應用程序到SQL Server。如果將來有一天,你想改變持久層(比如說Oracle,PostgreSQL,MySQL等),你將需要做很多工作。
  • 兩個世界的整合:OOP vs Relational在OOP開發人員與DBA的整合方面提出了難題。爲了簡化它,OOP開發人員不喜歡SQL,而DBA不喜歡C#。因此,您可能無法找到具備正確的Relational + OOP能力的合適人選,甚至是解決問題的意願。我個人認爲這很不幸,但這往往是企業界的現實。如果你是唯一維護應用程序的人,那不是問題。

否則,我認爲這是一個很好的設計選擇。

請注意,您也可以使用SQL 2008 Table-Valued parameters with user-defined table types作爲使用CLR/SQL Server集成工具的同類結果。 PS:你也可以爲所有這些使用代碼生成器,這將減少工作。

+0

在一年後看到這一點,對於使用代碼生成器(NHibernate,LINQ to SQL等)的建議+1。 – MarioVW 2013-08-22 20:39:34

1

那麼,如果任何人都在此時間後讀取該.....

如果貴公司使用SQL Server時,他們通常保持與SQL Server,所以我想如果這是你的環境,並可能保持索姆那麼這是一個好主意。我查看了Entity Framework和NHibernate,發現它們都非常複雜 - SQL Server和原始ADO功能非常強大,只需幾個方法,並且在應用程序層和數據庫層之間彈跳數據結構,實際上是用戶定義的表變量。 上面提到的OOP vs DBA是完整的 - 如果您正在開發數據庫驅動的應用程序,您應該瞭解數據庫以及應用程序層的OO體系結構,否則您的頭就在沙灘上。

相關問題