最近在研究数据访问层(DAL),书上说对数据库的更新,最好通过存储过程来完成。以普通的进销存为例,一般来说,都会有一个主表,一个明细表,用存储过程来更新,存储过程不是要设置很多参数才行?参数数量=主表字段+明细表字段。如果两个表加起来有20个字段,那对应的存储过程不是要设置20个参数?而且,后期维护,主表或明细表都有可能增加字段,那不单是数据库的表要改,程序要改,存储过程也要改。再有,用存储过程更新,会把别人的修改也覆盖了,假设张三和李四,同时修改了主表的某条记录,如果是用sqlDataAdapter来更新,会触发更新冲突,而用存储过程,则是最后保存的,将前面保存的修改给覆盖。基于以上两点,我实在不明白,有存储过程更新有什么好处?当然,存储过程在查询方面的高效,这点是无可置疑的。
望各位大虾指点迷津!不胜感激! 

解决方案 »

  1.   

    DAL与具体的数据库操作分开
    业务层中不用connection.
    LINQ TO SQL
    事务处理,锁机制
      

  2.   

    使用存储过程主要是看重他执行时的效率,大规模数据量的查询,存储过程比一般sql效率提高是
    很明显的。你说的第一个问题,即使不用存储过程同样存在,所以不是存储过程的问题。第二个纯粹是业务逻辑的需求,很多方法都可以处理这种并发的修改,比如时间戳,锁机制,具体
    还要看业务逻辑,有的可能就要后面的覆盖前面的,有的可能发现数据不是最新就放弃后面的操作。
      

  3.   


    如果用sqlDataAdapter来实现更新:
    第一个问题,可以先在主表和明细表里NewRow,增加数据后,通过sqlDataAdapter的update()方法来一次更新,这样不就可以解决存储参数过多的问题了吗?而且,后期维护,字段有增删改的话,也只要修改程序和sqlDataAdapter即可,少了一个修改存储过程的步骤,这样不是更方便吗?第二个问题,用sqlDataAdapter更新,如果存在并发,sqlDataAdapter可以捕捉到,这样在表示层,就可以弹出相应的窗口,让用户选择是放弃更新还是强制更新,而用存储过程,是直接就覆盖掉,虽然存储过程可以用事务控制数据的一致性,但面对并发,表示层就无法展现了。所以,存储过程在更新方面,意义究竟何在?