2009-09-21 38 views
0

我从我的DAL调用更新SPROC,传递表中的所有(!)字段作为参数。对于最大的表,这是总共78. 我通过所有这些参数,即使可能只是一个值更改。SPROC更新记录:如何处理不变的值

这似乎相当inefficent给我,我想知道,怎样做的更好。

我可以定义所有的参数为可选的,只有通过改变的,但我的DAL不知道哪个值发生了变化,因为我只是路过它的模型 - 对象。

我可以做餐桌上的选择updateing之前和比较值来找出哪些改变,但是这可能是办法不多开销,也(?)

我有点困在这里...我对你对此的看法很感兴趣。

编辑:忘了提:我使用C#(速成版)与2008年的SQL(也快速)。 DAL我写了“我自己”(使用this文章)。 它可能不是最新的最先进的方式(从2006年开始,“Linq之前”就这么说,但Linq仅适用于Express的本地SQL实例),但我的主要目标是学习C#,所以我想这不是太糟糕。

+0

您使用哪种语言? – 2009-09-21 11:18:52

+0

我很好奇你将如何编写sproc来处理变量列的修改集。你打算动态生成更新语句吗? – 2009-09-21 12:00:49

+0

我会做这样的事情: CREATE PROCEDURE UpdateSomething \t @something VARCHAR(50)= NULL \t AS BEGIN BEGIN TRANSACTION \t IF @something IS NOT NULL UPDATE TBLTEST SET东西= '富' COMMIT \t END 不知道如果这是不好的,这就是为什么我问 – 2009-09-22 09:44:51

回答

0

如果您可以更改DAL(在更改完成后,一旦图层从新模式“重新生成”时不会丢弃更改),我会推荐传递一个包含正在更改值的列的结构和一个结构kontaing关键列和值的更新。

这可以通过使用哈希表来完成,如果模式是已知的,应该很容易操纵此次在“新”的更新功能。

如果这是一个自动DAL,这些都是一些使用DALS

0

弊端您可以实现日记变化追踪你的模型对象。这样,每次设置新值时,都可以通过保存属性的先前值来跟踪对象中的任何更改。
这个信息可以存储在以下两种方法之一:

  1. 由于每个对象自己的私有状态
  2. 集中在“经理”类的一部分。

在第一种解决方案中,您可以在基类中轻松实现此功能,并通过继承使其在所有模型对象中运行。

在第二个解决方案,你需要创建某种容器类,将保持基准和一个唯一的标识符,以所创建的任何模型对象,并记录在一个中央存储在其状态的所有变化。
这与许多ORM(对象关系映射)框架实现这种功能的方式类似。

0

现有的ORM支持这些场景相对较好。编写你自己的ORM将使你没有很多这样的功能。我发现“object.Save()”模式导致这种行为,但没有理由你需要遵循该模式(虽然我本人并不是一个object.Save(),我的粉丝感觉像我在少数)。

数据层可以通过多种方式知道更改了哪些内容,并且大部分内容都由现成的ORM支持。您还可以使UI和/或业务层足够聪明,将这些知识传递到数据层。我更喜欢

两个选项:

  1. 生成/手动编码更新 方法,只有采取一系列 参数,往往会改变。
  2. 完全在飞行中生成更新语句 。