c#.net三层结构中,添加和修改数据时,如何有效存储?即我通过页面添加或修改某一个字段的值,如何在通过实体类保存到数据库时只insert 或update这一个添加或修改过的字段,而其它没添加值或经过修改的字段就不必往数据库中写入了。如果用代码通过两个存数据字段值的实体类来进行比较的话,例是可以实现,不知各位高手有没有更好的办法,比如能使同一个实体类有一个原映像和修改后的类相比较,或者ado.net有没有什么办法能内部比较字段是否有新增值或修改值而进行有效存储,对没有值或没经修改的字段就不必再操作了?谢谢各位高手了!!!

解决方案 »

  1.   

    谢谢Snowdust(雪尘) ,这个办法我想过,可以用一个实体记录数据库中的原记录内容,用另一个实体记录页面修改过的新记录内容,在update时依次比较两个实体各字段是否有改变,只把有改变的字段update set=‘新值’ 就行了,但我还是想找更好更省事的办法,不知道有没有?  不过,还是很感谢您,真的!在线等了半天,终于有人开始给出主意了,真的谢谢您!
      

  2.   

    在实体类内部增加一个State属性,来表示修改,新增或是删除。
      

  3.   

    一次更新整条记录实体更具通用性,修改该表只需要写一条Sql语句,但效率可能不及每次只更新修改了的效率高。但如果每次只更新修改了的字段,并且该表中含有几个字段,这种情况下,可以考虑在运行过程中构造Sql语句,例如在实体中维持一个bool数组,分别记录每个字段是否有更新,要执行update时根据该数组动态构造Sql语句,这个处理过程也要消耗一定的资源和时间。两种方式各有优劣,实际项目中,可以考虑对更新经常更改的字段或字段组合预先定义几个Sql语句,或动态构造Sql语句;而对不是很频繁的更新操作,采用一次更新整条记录的方式。
      

  4.   

    有个想法,不知可不可行。
    在类中声明一个私有的HashTable类型的属性,当数据字段有更新时,在HashTable中添加该字段的名称和引用,如this.hsTable.Add("column_name", this.columnProperty);更新类的时候遍历哈西表生成配对的字段名和参数值。
      

  5.   

    学习 楼主 能把你现在写的代码 给我看看吗[email protected] , 多谢!
      

  6.   

    以上各位可能因为对我的实际需要不很了解,所以提的建议都不符合我的实际需求,但依然很感激各位的建议和意见!谢谢大家!这个问题我前两天已经初步解决了,只是因为工作忙,没有上网来告知大家,请见谅!
    我的解决办法是这样的:
    1、修改数据时,先把代表所修改数据记录各值的实体类对象通过xml序列化存到本地的一个xml文档中;
    2、在页面修改数据部分字段值;
    3、页面修改完,将修改后各值赋给一个新的实体类对象,在此暂称:修改后数据实体对象
    4、提交保存之前,再new一个此实体类对象,通过xml反序列化,把第1步中所保存在本地xml文档进行反序列化给此实体类对象,在此暂称:修改前数据实体对象;
    5、提交保存时,将这两个分别代表记录修改前后的实体对象都传到DAO层修改函数,在DAO层对两个对象各数据值进行比较,凡是值不同(即此值被修改了),就update;反之,就不update了。当然,这个办法也不是最好的,所以,大家有什么好办法,敬请提出来,共同学习!
      

  7.   

    不知你的数据库用的是什么。我以前在SQL2000上做过实验(用触发器监视),Update记录时,SQL2000实际上是把原来的记录删除,再用新值插一条记录回去。所以后来我更新记录都是整条更新,不去考虑哪些修改过,哪些没修改过。可能其它数据库也是这样。
      

  8.   

    楼主在讨论这个问题的时候先要想清除你提出这个问题的目的是什么?
    如果仅仅是为了提高数据存储效率,那么我可以告诉你,这个效率在于客户端发多少个SQL存取语句给数据库,而不是发多长的语句。
    同样一次连接,最花时间的绝对不是在SQL服务器的执行上,而是在客户端和服务器的通讯上。
    那么对应你的例子,如果我有个User类 当我修改 name 和 age 假设他是一次跟新那么你得系统消耗是一次连接。但是如果 name 和 age 分开跟新那么他的系统消耗是两次连接。当然你也可以通过延时跟新来做到一次那么你得系统开销还是一次连接 外加很多多余的控制跟新的代码。
    楼主认为那个划算呢?
      

  9.   

    我的网站有个例子,是通过存储过程来实现的,楼主有兴趣可以去看看
    http://www.szsoftware.com.cn/showsoft.asp?id=4
      

  10.   

    TO:1、修改数据时,先把代表所修改数据记录各值的实体类对象通过xml序列化存到本地的一个xml文档中;
    2、在页面修改数据部分字段值;
    3、页面修改完,将修改后各值赋给一个新的实体类对象,在此暂称:修改后数据实体对象
    4、提交保存之前,再new一个此实体类对象,通过xml反序列化,把第1步中所保存在本地xml文档进行反序列化给此实体类对象,在此暂称:修改前数据实体对象;
    5、提交保存时,将这两个分别代表记录修改前后的实体对象都传到DAO层修改函数,在DAO层对两个对象各数据值进行比较,凡是值不同(即此值被修改了),就update;反之,就不update了。感觉这样做效率也太低了一点...
    那你这样序列化又反序列化的,还不如创建两个对象,一个用于保存修改前,一个用于存储修改后的呢?
    我觉得秋枫大哥的办法很好"在实体类内部增加一个State属性,来表示修改,新增或是删除"..
    楼主为什么不考虑一下这种办法呢?