我一直在阅读关于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