none
c#主子表:主表删除时,怎样先删除子表. RRS feed

  • 问题

  • MbindingSource 是主表数据源, SbindingSource是子表数据源,
    现主表想删除一条记录, 怎么在删除主表记录之前先删除子表的记录???
    如果设定了主子关系(DataRelation), 是不是可以自动删除, 而不要额外的处理??

    2010年3月1日 7:13

答案

  • 你好!

    最好的方式是在数据库设置外键关系,如果在程序中你需要自己写代码。比如:

    string commandText = @"
    DELETE DetailTable WHERE MasterId = @Id -- 根据主表主键删除子表的所有记录
    DELETE MasterTable WHERE Id = @Id -- 根据主表主键删除主表记录" ;
            
            SqlCommand comm = new SqlCommand();
            comm.CommandText = commandText;
            comm.Parameters.AddWithValue("@Id", yourValue);


    知识改变命运,奋斗成就人生!
    2010年3月1日 10:23
    版主

全部回复

  • 你好!

    在数据库中外键关系属性上选中“级联删除”后,当你删除主键后会自动删除子表相关的记录。

    知识改变命运,奋斗成就人生!
    2010年3月1日 7:46
    版主
  • 数据库中没有设置外键, 都当作独立的表, 主子关系是在程序里面控制的,
    2010年3月1日 9:21
  • 你好!

    最好的方式是在数据库设置外键关系,如果在程序中你需要自己写代码。比如:

    string commandText = @"
    DELETE DetailTable WHERE MasterId = @Id -- 根据主表主键删除子表的所有记录
    DELETE MasterTable WHERE Id = @Id -- 根据主表主键删除主表记录" ;
            
            SqlCommand comm = new SqlCommand();
            comm.CommandText = commandText;
            comm.Parameters.AddWithValue("@Id", yourValue);


    知识改变命运,奋斗成就人生!
    2010年3月1日 10:23
    版主
  • 你可能是理解错了, 我现在只要提交到dataset就行了(也就是在dataset中两个表的删除记录都标上删除标记), 不是提交到数据库.
    再描述一下:
    dataset中包含两个表, 这两个表是主子表关系, 但在数据库中是没有设置外键关系, 也就是说在数据库中是相互独立的表.
    主子表关系是在程序中由代码控制.
    现在这两个表各自关联到bindingsource(即,主:MbindingSource; 子:SbindingSource), 并且绑定到两个GridView上.
    现在想实现:
    在主GridView删除一条记录之前先把子GridView中的记录删除. 需不需要写代码处理? 还是设置了关系就可自动实现,而不用额外写代码处理?
    2010年3月2日 3:03
  • 不需要写代码,这和数据库一样,你将关系的删除规则设置级级联删除,当删除主表记录时子表相关的记录同时也会被标记为删除。

    知识改变命运,奋斗成就人生!
    2010年3月2日 4:25
    版主