获取自增主键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(),'男')");
sqlStringBuilder.AppendFormat("declare {0} int;set {1}=SCOPE_IDENTITY();", "@UserIdentityId", "@UserIdentityId");
sqlStringBuilder.AppendFormat("insert into Descriptions values({0},{1},getdate())", "@UserIdentityId", "获取自增Id添加描述");
sqlCommandList.Add(sqlStringBuilder.ToString());
ExecuteSqlTran(sqlCommandList);
}
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;
}
}
}