首先插入A表
然后去的A表的newid
再插入B表和C表
B,C两表中存在A表的newid 
要写在后台程序中  这样的sql事务 该如何写 小弟求教

解决方案 »

  1.   

            using (SqlConnection conn = new SqlConnection())
            {
                conn.ConnectionString = "";
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tran = conn.BeginTransaction;
                cmd.Transaction = tran;
                try
                {
                    cmd.CommandText = "insert into A(name) values(@name);select @@identity";
                    cmd.Parameters.AddWithValue("@name", "");
                    int newid = Convert.ToInt32(cmd.ExecuteScalar());
                    cmd.CommandText = "insert into b(id) values(@id)";
                    cmd.Parameters("@id", newid);
                    //...
                    tran.Commit();
                }
                catch
                {
                    tran.Rollback();
                }
            }
      

  2.   

    newid是主键   在数据库中40220523-c2d1-4707-9bde-8fce59022345这样的形式huangwenquan123所说  
    cmd.CommandText = "insert into A(name) values(@name);select @@identity";
    是取自增长列吧
      

  3.   


    就是这个事务 该怎么写呢?求教 
    插入A表成功后,取A表newid(),再插入B表和C表 
      

  4.   

    begin transaction
     insert 一条数据
     selelct @newid=@@identity;//取出自动增长值
    insert b(id) values(@newid);
    insert c(id) values(@newid);
    if(.....)
    commit
    else
    rollback
      

  5.   

    大家看清楚哦 是newid(),不是自增长的列....@@identity这不适用的,谢谢大家帮忙哦
      

  6.   

    参考:http://www.cnblogs.com/insus/articles/1603504.html
      

  7.   

     /// <summary>
            /// 执行sql语句,返回一行一列。。
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns></returns>
            public static string GetScalar(string sql)
            {
                SqlCommand command = new SqlCommand(sql, Connection);
                return command.ExecuteScalar().ToString();
            }
      public static string SelectLastId()
           {
               string sql = "select max(identitycol) from A";
               string Id = GetConnection.GetScalar(sql);
               return Id;
           }调用SelectLastId()的方法就可以得到A的newId了,这样就可以根据newid插入到B和C了
      

  8.   

    那就插入后在
    select top 1 newid from a order by id desc
      

  9.   

    A表中有标识列吗,想来不会有了。
    这就麻烦了,你没有办法保证插入A表后取到最后一次的newid,
    这就要考虑用触发器了
      

  10.   

    可以写一个方法,把你的dataset传进去,第一个datatbale是主表,然后子表1,子表2....
    循环datatable写成一条很长的SQL,有特定字符分割。
    然后使用事务插入到数据库中。
    前提是这个dataset里面包含主附表完整的数据。也就是表之间关系已经确定。
      

  11.   

    //执行事务处理
    public void DoTran()
    {  //建立连接并打开
     SqlConnection myConn=GetConn();
     myConn.Open();
     SqlCommand myComm=new SqlCommand();
     //SqlTransaction myTran=new SqlTransaction();
     //注意,SqlTransaction类无公开的构造函数
     SqlTransaction myTran;
     //创建一个事务
     myTran=myConn.BeginTransaction();
     try
     {
      //从此开始,基于该连接的数据操作都被认为是事务的一部分
      //下面绑定连接和事务对象
      myComm.Connection=myConn;
      myComm.Transaction=myTran; //定位到pubs数据库
      myComm.CommandText="USE pubs";
      myComm.ExecuteNonQuery();//操作1
      myComm.CommandText=""; //操作2
      myComm.ExecuteNonQuery();
       //提交事务
      myTran.Commit();
     }
     catch(Exception err)
     {
      myTran.rollback();
      throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
      }
     finally
     {
      myConn.Close();
      }
    }
      

  12.   

    在外键插入后,用;结束语句,并追加select @@identity即可获取刚刚插入的ID标识
    用Select Scope_Identity()也可以
    存储过程里,你可以将其赋给一个变量,然后再插入后面的数据
    全部一起用事务来确保一致性