我正在做一个文章管理系统的后台,程序结构大致是这样的:页面上一个FormView绑定ObjectDataSource控件,ODS控件的SelectMethod,InsertMethod,UpdateMethod绑定BLL层的Article类的方法,BLL层的方法再调用DAL层的方法,执行具体的SQL语句以及返回值。现在想在FormView插入一条记录之后,获得刚刚插入记录的ID值,在以前不分层的时候,直接用ADO.NET,构造一个output参数就能获得SELECT @ID==@@Identity的值,现在分三层了,DAL和BLL之间倒是很好传递参数,但是BLL想返回参数到页面该怎么做?我看到ObjectDataSource的参数有Direction="Output"和"ReturnValue"的属性,但那似乎只针对直接写存储过程的,不好用在BLL层上。

解决方案 »

  1.   

    好像类似ObjectDataSource这种控件,和三层结构都是相违背的,这种拖拉式的编程方式仅仅能够加快速度,对程序的可维护性没有好处
      

  2.   


    要是不用ObjectDataSouce的话,又回到WebForm+ADO.NET的老路上去了,需要手工键入很多代码,而且少了很多ASP.NET2.0以后的高级数据绑定控件带来的便利性,很可能得不偿失啊。
    比如我的BLL层中,Article.Insert()方法,返回值是刚插入的文章ID,那么我前台页面的ObjectDataSource或者是FormView在执行完插入操作后怎么才能取到呢?我想微软应该会考虑到吧。求高手指点!
      

  3.   

    不需要参数,只要BLL的Insert方法返回插入记录的ID,然后在ObjectDataSource的Inserted事件里获取e.ReturnValue就可以了。
      

  4.   


    谢谢指教,分就结给你了!经过我测试,<InsertParameters>里面用
    <asp:Parameter Name="文章ID" Type="Int32" Direction="ReturnValue" />的方式会出错,
    因为BLL层里面的方法这样写不认:
    public static int Insert(string 标题,string 内容) {...}
    会出错提示 InsertMethod调用的参数必须是 标题,内容,文章ID
    因此也就没机会写e.ReturnValue了所以只能用<asp:Parameter Name="文章ID" Direction="Output" />
    BLL的方法改成
    public static void Insert (string 标题,string 内容,out int 文章ID)
    即可通过e.OutputParameters["文章ID"]返回新插入的ID了