比如我的一个目录,分一级目录跟二级目录,删除一级目录时,如果发现该一级目录没有二级目录,那么可以直接删除,
如果有存在二级目录,则拒绝删除,当然这个我们是可以进行判断的。但是如果直接在存储过程里判断的话,asp.net执行页面是不会有类似msgbox这样的提示框出现的,他只按where条件语句里的删除,当然有可能是删除0记录,反正他就是执行就是了。我现在有这样的解决方案,不知道能不能实现:存储过程里:执行查询,发现有二级目录存在,则输出参数给asp.net页面,asp.net程序借此判断有二级目录存在,将false之类的传递给输入参数,该存储过程根据输入函数如果是falsemze则回滚删除操作,或不执行删除。true则彻底删除!这样的解决方案可以吗,或者各位有更好的解决方案吗?尽量存储过程跟asp.net程序独立不耦合,交互使用输入输出参数等接口。这样的方案可以吗?谢谢提供

解决方案 »

  1.   

    可以的,存储过程的参数声明加上output就可以了,如
    Create Procedure aa
    (@IsChildExists bit output)
    As
    ...
      

  2.   

    从效率上来说级联更新和级联删除最高如果在表里建了主外键关系数据库自动不会让你删除,如果删除一级目录也可以自动删除所属的二级目录外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK约束、规则约束、触发器、客户端程序,一般认为,离数据越近的方法效率越高。
      

  3.   

    能不能顺便说下我这个解决方案的大概流程及如何将删除失败的信息反馈到asp.net的页面上
      

  4.   

    如何将删除成功或失败的信息反馈到asp.net页面上呢?
      

  5.   

    try catch应该可以把,或者得到它的错误编号如果catch到错误或得到错误编号就输出错误提示,如:ClientScript.RegisterStartupScript(GetType(), "error", "<script>alert('error!');</script>");
      

  6.   

    晕,刚回复的时候CSDN居然发生错误,貌似数据库也用的是2005再贴一次:
    你可以用下面代码测试下看看错误代码是多少:try
    {
        doWith();//此方法里做级联删除
    }
    catch (System.Data.SqlClient.SqlException e)
    {
        string errCode = e.ErrorCode;
    }
      

  7.   

    Create Procedure DeleteDirectory
     @parentID int 
    As 
     if exists(select ... from yourTable where parentID = @parentID)
       return -1
     
     begin try
       begin tran
            --删除二级目录
            --删除一级目录
       commit tran
       return 0
     end try
     begin catch
       rollback tran
       return -1
     end catch
    go程序根据存储过程的返回值来做相应输出,当然楼主得会使用ado.net存储过程的返回值以上方案也可以用输出参数解决
      

  8.   

    昨天晚上回忆了下数据库完整性,楼上几个的确说的不错,我也已经在程序里实现了。
    amandag的方法应该是效率最低的。