db.RunProc("ERP_Ex_Warehouse", ds);cmbgetgoods.DataSource = ds.Tables[2];cbxOutStoreTypeId.DataSource = ds.Tables[3];DataRelation drelation = new DataRelation("FK_Order_Detail", ds.Tables[0].Columns["OutStoreBillId"], ds.Tables[1].Columns["OutStoreBillId"], false);ds.Relations.Add(drelation);bs_order.DataSource = ds;bs_order.DataMember = ds.Tables[0].TableName;bs_detail.DataSource = bs_order;bs_detail.DataMember = "FK_Order_Detail"; 
像上面这样的两表如何更新比较好,首选更新时都是用da.update()的方法我先说下我的想法,
我想先更新主表,然后更新从表,
在从表中建个触发器INSERT时取出主表Select SCOPE_IDENTITY()的编号更新到从表中去
大家说说,你们常用的做法,再讨论一下我的做法的不足之处

解决方案 »

  1.   

    我一般用存储过程
    BEGIN TRANSACTIONINSERT INTO 主表
    IF @@ERROR<>0
    BEGIN
    RAISERROR('XX出错',16,1)
    ROLLBACK TRANSACTION
    RETURN
    END INSERT INTO 从表
    IF @@ERROR<>0
    BEGIN
    RAISERROR('XXXX出错',16,1)
    ROLLBACK TRANSACTION
    RETURN
    END COMMIT TRANSACTION
      

  2.   

    这是数据库的基本特性.你试着在数据库中以下脚本建立两个表,然后在MainTable中输入两个数据,再SubTable中输两个数据,然后改一下MainTable里的ID,看SubTable的FID会不会同步改变.CREATE TABLE [MainTable] (
    [ID] [int] NOT NULL ,
    [Name] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    CONSTRAINT [PK_MainTable] PRIMARY KEY  CLUSTERED 
    (
    [ID]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    CREATE TABLE [SubTable] (
    [FID] [int] NULL ,
    [FName] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    CONSTRAINT [FK_SubTable_MainTable] FOREIGN KEY 
    (
    [FID]
    ) REFERENCES [MainTable] (
    [ID]
    ) ON DELETE CASCADE  ON UPDATE CASCADE 
    ) ON [PRIMARY]
    GO
      

  3.   

    楼上,再请教一下,像我在dataset中添加 ForeignKeyConstraint fk = new ForeignKeyConstraint(ds.Tables[0].Columns["OutStoreBillId"], ds.Tables[1].Columns["OutStoreBillId"]);
                ds.Tables[1].Constraints.Add(fk);
                ds.EnforceConstraints = true;
    能实现添加时同步ID吗
      

  4.   

    DataSet中DataTable的关系就是数据库表关系的在内存中的翻版。
    下面抄一段MSDN:
    ForeignKeyConstraint 的 DeleteRule 和 UpdateRule 属性定义在用户试图删除或更新相关表中某行时采取的操作。 下表描述可用于 ForeignKeyConstraint 的 DeleteRule 和 UpdateRule 属性的不同设置。规则设置
     说明
     
    Cascade
     删除或更新相关的行。
     
    SetNull
     将相关行中的值设置为 DBNull。
     
    SetDefault
     将相关行中的值设置为默认值。