1、建立约束,用一个事务控制整个整个数据新增的过程:即把主从表新增数据的代码放在一个事务中。2、看了你A表,如果ID是用的自动编号,可以通过@@identity得到当前自动编号的值。

解决方案 »

  1.   

    楼上,如果A表的ID不是自动编号呢?A表的ID是手动+1,该怎么处理?
      

  2.   

    我也是用的识别种子:
    public  Int32 GetID(string table)
            {
                Int32 newProdID = 0;
                try
                {
                    string sqlstring = "SELECT   IDENT_CURRENT(@table)   +   (SELECT   IDENT_INCR(@table)) ";
                    SqlCommand sqlcmd = new SqlCommand(sqlstring, this.cnn);
                    sqlcmd.Parameters.Add(new SqlParameter("@table", table));
                    cnn.Open();
                    newProdID=Convert.ToInt32( sqlcmd.ExecuteScalar());
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    cnn.Close();
                }
                return newProdID;
            }
    =====上面的方法要传入参数(你的主表),可以取得ID号,然后把子表的对应ID=这个取得的值然后将主表与子表的SQL指令拼在一起,用事务提交就可以了....
      

  3.   

    YUAN168(风平浪静真好......) 主表ID一定是要自增的吗?不是自增的行不行?手动+1的行吗?分不是问题的,解决了少不了你的啦  ^_^
      

  4.   

    SELECT IDENT_CURRENT('表名') + (SELECT IDENT_INCR('表名'))
    这种办法中可以取得将要插入的自动ID号,但并发怎么办呢?即在你事务还未完成的情况下,别人已经插入了数据,插入的这个子表的数据不是要关联到别人主表中?
      

  5.   

    我刚测试了一下,如果表第一次插入(之前没有任何插入),SELECT IDENT_CURRENT('表名')取得的是1,但插入了一条后,SELECT IDENT_CURRENT('表名')取得的值还是1,所以SELECT IDENT_CURRENT('表名') + (SELECT IDENT_INCR('表名'))在没有任何数据插入之前2,实际是没有,只插入一条后,应该是1,而SELECT IDENT_CURRENT('表名') + (SELECT IDENT_INCR('表名'))结果是2,所以需要在程序中判断
      

  6.   

    A表
    字段ID,A一个事务,我写两条记录到A表,A表的ID是手动+1的,不是自增的.
    事务写到第二条记录时,怎么取到第一条记录的ID值?
      

  7.   

    表A
    字段两个:ID,OLID其中ID是int,不自增一个事务
    第一个SQL:insert A(ID,OLID)select max(ID+1),'1'
    第二个SQL:我要把上一条记录的ID值插入OLID中.要怎么写才可以啊?