比如如下两表,提库单索引表为主表,提库单产品表为副表,提库单号是主键,是流水号,即是自动生成的       提库单索引表(表1)                                 提库单产品表(表2) 提库单号(PK) 提库时间  提库人        产品编号(PK)  产品名称  数量  提库单号(PK)说明:表1是用insert语句插入的,而表2是用dataset的update实现的
1.在插入时,必须先插入表1,才能插入表2,如何使得表2获得刚插入的表1的 提库单号?同时还要防止多人操作的情况(好像的用死锁?)
2.删除时,只需删除表1,因为关联,表2会自动删除,同时还要防止多人操作的情况(好像的用死锁?)
3.更新有如何实现呢?注:假设插入主键表没问题
附一段程序(也许想法不对):
  Private Sub PutInDataBase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PutInDataBase.Click
            Dim str As String
            Dim cmd As SqlCommand
            Dim Con As SqlConnection
            Dim count As Integer
            Con = New SqlConnection("Server = localhost;uid=sa;pwd=l801231;database=XXDB")            '将数据插入到InWHTableIndex
            cmd = New SqlCommand("PickUpWHTableIndexInsert", Con)
            cmd.CommandType = CommandType.StoredProcedure            cmd.Parameters.Add("@BillOfLadingID", SqlDbType.Char, 14)
            cmd.Parameters("@BillOfLadingID").Value = Session("BillOfLadingID")
          
            cmd.Parameters.Add("@PickDate", SqlDbType.SmallDateTime)
            cmd.Parameters("@PickDate").Value = Session("PickDate")
            cmd.Parameters.Add("@WHCharger", SqlDbType.Char)
            cmd.Parameters("@WHCharger").Value = Session("WHCharger")
            Con.Open()            Try
‘插入主键表
            cmd.ExecuteNonQuery()
        ’如何插入副键表,副键表数据在dataset中    
            Dim adapter As SqlDataAdapter
            Dim mybuilder As SqlCommandBuilder
            Dim ds As DataSet
            Dim i As Integer
            Dim mytable As DataTable            ds = CType(Session("a"), DataSet)
            mytable = ds.Tables(0)
×××××××××××
如何写?此断程序只是我的想法,也许我的想法根本不对,假设插入主键表没问题
×××××××××××
            Page.RegisterStartupScript("", "<script language='javascript'>alert('已成功添加记录!');window.opener.location.href='PickUpWHTransfer.aspx';</script>")            Catch exc As SqlException
            '   Page.RegisterStartupScript("alert", "<script language='javascript'> alert('出现错误,数据没能被成功录入!')</script>")
            'End Try            Con.Close()              End Sub谢谢大家!!!

解决方案 »

  1.   

    表1insert后获取生成的序列号
    表2也改为insert语句
    采用事务
      

  2.   

    查询select @@IDENTITY
    取得刚新增的ID若是主从表,建议你不要这样产生ID,自己定义规则,在保存时再生成,
    这样安全一些,尤其是多人操作
      

  3.   

    涉及你这样的多表操作,最好用数据库的存储过程加事务或者。net的事务机制来做。
    你要么查询数据库的相关帮助,一般都用到begin/end transaciton ,commit,rollback还有。net的事务建议查下msdn吧,不过估计等下应该有大大会贴相关的资料给你看的
      

  4.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqltransactionclasstopic.asp
    这个是msdn中sqlserver数据库的事务。net实现方法,你参考下,语句格式应该差不多
      

  5.   

    在数据库那层里定义foreignkey限制操作的前后顺序。@@identity是最新操作的记录号
      

  6.   

    public void RunSqlTransaction(string myConnString) 
     {
        SqlConnection myConnection = new SqlConnection(myConnString);
        myConnection.Open();    SqlCommand myCommand = myConnection.CreateCommand();
        SqlTransaction myTrans;    // Start a local transaction
        myTrans = myConnection.BeginTransaction();
        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        myCommand.Connection = myConnection;
        myCommand.Transaction = myTrans;    try
        {
          myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
          myCommand.ExecuteNonQuery();
          myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
          myCommand.ExecuteNonQuery();
          myTrans.Commit();
          Console.WriteLine("Both records are written to database.");
        }
        catch(Exception e)
        {
          try
          {
            myTrans.Rollback();
          }
          catch (SqlException ex)
          {
            if (myTrans.Connection != null)
            {
              Console.WriteLine("An exception of type " + ex.GetType() +
                                " was encountered while attempting to roll back the transaction.");
            }
          }
        
          Console.WriteLine("An exception of type " + e.GetType() +
                            " was encountered while inserting the data.");
          Console.WriteLine("Neither record was written to database.");
        }
        finally 
        {
          myConnection.Close();
        }
    }