例如,一个图书管理系统,当对一本书的信息做了Update操作后,希望可以得到这样的历史纪录:
xx管理员在xxxx时间,修改了xx图书,将图书标题从xxx改为xxx,作者从xx改为xx,......
注意:一本书可能有20多个属性,但我希望每次只记录确实有改动的属性。我希望可以在数据层或业务层来解决它,最好不要在页面外观层中实现。而且希望有比较好的扩展性,当图书的属性增加或减少时,不需要做大量的代码修改。请问各位有什么好的解决方案吗?

解决方案 »

  1.   

    写Insert,Update,Delete触发器,我是这样做的,但不能得到 xx管理员,只能写入后面的记录信息到历史记录表。期待有人能提供较完美解决方案!
      

  2.   

    sqlserver自己不是有日志吗?
    读过来改改
      

  3.   

    最好就是有一个log表,每新增,修改,删除等都添加到该表中,这样就会详细的记录。
    可以在logic层中写一个InsertLog这样一个方法,方法的实现是传入一个datatable,然后把字段循环插入,参考这里 
    http://community.csdn.net/Expert/topic/4018/4018933.xml?temp=.7349665当字段增多时只需在表示层把该字段的添加的要传入的datatable中即可,不用该logic层
      

  4.   


    正如3tzjq(永不言弃)  所说的
    写Insert,Update,Delete触发器,但不能得到 xx管理员,这个问题看似简单,但是要如意的话感觉比较难,我市没有想出什么好办法,要我做的话可能就直接写在外边了,这么做虽然看起来不怎么好,但是写起来方便,想要做扩充的话应该也容易
    ======================================================
    欢迎加入.net群:13817403(如果遭拒绝则说明群已满)本人大四,下学期找工作了,各位兄弟帮帮忙
    我的简历:http://202.118.70.40/winal/introduce.aspx
    ======================================================
      

  5.   

    自己封闭一个数据库操作类,在每个方法里面记录sql就可以了。
      

  6.   

    哈哈,DataSet.getchanges()可以很好的解决哦。
    但不知道现在的2003版本是不是支持,不过2005是绝对支持的。
      

  7.   

    我这里是在信息表中加入一个自动触发列专门纪录对信息做最后更新的用户ID,然后再做log表。写存储过程,在修改信息的同时更新log表。
      

  8.   

    自己封闭一个数据库操作类,在每个方法里面记录sql就可以了。这个方法不错.
      

  9.   

    搂主的目的可以实现,但是你要增加一种强类型Dataset数据结构,那么中间传递的对象就是Dataset 或 DataTable,所以我们其他层次都不需要修改。
      

  10.   

    UserHistorys(User,MessageType,Content,DateTime)
    MessageType:0 = System, 1 = Error, 2 = Operator