我一直在閱讀關於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的潛在有用應用。所以,這個問題基本上是:這種方法會產生什麼缺點和/或問題?你會推薦(反對)使用這種方法嗎?
任何人有任何關於這個問題的想法? – MarioVW 2012-09-11 07:51:02
「我發現大多數人發現它們是邪惡的」 - 我猜那些人不會使用「geography」或「geometry」類型,因爲那些是CLR類型。 – 2012-09-11 07:57:59