常用SQL语句总结(3)

来源:互联网 发布:大数据分析师招聘 编辑:程序博客网 时间:2024/05/16 03:06

获取自增主键Id并实现事务

  • 表A为用户信息表,表B为日志表,每当A插入一条信息时B都要插入一条日志,在写日志的时候需要把刚刚插入A表的那条数据的自增主键Id也写到日志中,以识别该日志对应A表哪条信息。
  • 重点来了,要想把刚刚插入A表的那条数据的自增主键Id写到B表中,首先要获取这条数据的自增主键Id。
  • 由于向A、B中插入数据具有关联性,必须都插入或都不插入,如果有一项插入失败就会造成数据缺失,为避免部分Sql执行失败的情况发生,可以使用事务来处理,把向A、B中插入数据作为一个整体,如果在这个整体执行过程中有Sql语句执行失败的情况则回滚到Sql执行之前的状态,这样就避免了数据缺失是情况,同时也不会对原数据造成影响。
protected void btnIdentityId_Click(object sender, EventArgs e){    List<string> sqlCommandList = new List<string>();    StringBuilder sqlStringBuilder = new StringBuilder();    sqlStringBuilder.AppendFormat("insert into UserInfo values('2016001','蝈蝈',getdate(),'男')");    //获取刚插入到UserInfo表的那条信息的自增Id    sqlStringBuilder.AppendFormat("declare {0} int;set {1}=SCOPE_IDENTITY();", "@UserIdentityId", "@UserIdentityId");    //通过变量名使用刚插入到UserInfo表的那条信息的自增Id    sqlStringBuilder.AppendFormat("insert into Descriptions values({0},{1},getdate())", "@UserIdentityId", "获取自增Id添加描述");    sqlCommandList.Add(sqlStringBuilder.ToString());    ExecuteSqlTran(sqlCommandList);}/// <summary>/// 执行多条SQL语句,实现数据库事务。/// </summary>/// <param name="SQLStringList">多条SQL语句</param>     public static int ExecuteSqlTran(List<String> SQLStringList){    using (SqlConnection conn = new SqlConnection(connectionString))    {        conn.Open();        SqlCommand cmd = new SqlCommand();        cmd.Connection = conn;        SqlTransaction tx = conn.BeginTransaction();        cmd.Transaction = tx;        try        {            int count = 0;            for (int n = 0; n < SQLStringList.Count; n++)            {                string strsql = SQLStringList[n];                if (strsql.Trim().Length > 1)                {                    cmd.CommandText = strsql;                    count += cmd.ExecuteNonQuery();                }            }            tx.Commit();            return count;        }        catch        {            tx.Rollback();            return 0;        }    }}
1 0