SPROC更新记录:如何处理未更改的值

时间:2009-09-21 10:46:31

标签: stored-procedures parameters data-access-layer

我正在从我的DAL调用更新SPROC,将表的所有(!)字段作为参数传递。对于最大的表,这是总共78。 我传递所有这些参数,即使可能只改变了一个值。

这对我来说似乎相当无效,我想知道如何更好地做到这一点。

我可以将所有参数定义为可选,只传递更改的参数,但我的DAL不知道哪些值发生了变化,因为我只是将模型 - 对象传递给它。

我可以在更新之前在表上进行选择并比较这些值以找出哪些值发生了变化,但这可能会带来很多开销,也是(?)

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

编辑:忘了提一下:我正在使用C#(Express Edition)和SQL 2008(也是Express)。 DAL我写了“我自己”(使用this文章)。 它可能不是最新的最先进的方式(从2006年起,“Linq之前”这么说,但Linq仅适用于Express中的本地SQL实例)这样做,但我的主要目标是学习C#,所以我猜这不是太糟糕。

3 个答案:

答案 0 :(得分:0)

如果您可以更改DAL(在进行更改时,一旦从新模式“重新生成”图层时不会丢弃更改),我会建议传递一个包含要更改的列的结构,并使用值和结构kontaing键更新的列和值。

这可以使用哈希表来完成,如果架构已知,那么在“新”更新函数中操作它应该相当容易。

如果这是一个自动DAL,这些是使用DAL的一些缺点

答案 1 :(得分:0)

您可以在模型对象中实施日记更改跟踪。这样,您可以通过在每次设置新值时保存属性的先前值来跟踪对象中的任何更改。
此信息可以通过以下两种方式之一进行存储:

  1. 作为每个对象自己的私有状态的一部分
  2. 集中在“经理”课程中。
  3. 在第一个解决方案中,您可以在基类中轻松实现此功能,并通过继承在所有模型对象中运行。

    在第二个解决方案中,您需要创建某种容器类,该类将为创建的任何模型对象保留引用和唯一标识符,并在中央存储中记录其状态的所有更改。
    类似于许多ORM(对象 - 关系映射)框架实现此类功能的方式。

答案 2 :(得分:0)

现成的ORM相对较好地支持这些场景。编写自己的ORM会让你没有很多这样的功能。

我发现“object.Save()”模式导致了这种行为,但没有理由你需要遵循这种模式(虽然我个人不是object.Save()的粉丝,我觉得就像我是少数人一样。)

您的数据层可以通过多种方式了解已更改的内容,并且现有的ORM支持其中的大部分内容。您还可以使UI和/或业务层足够智能,以将该知识传递到数据层。

我更喜欢两个选项:

  1. 生成/手动编码更新 只采取一组的方法 倾向于改变的参数。
  2. 生成更新语句 完全在飞行中。