C#如何调用事务

C#如何调用事务
2025-05-11 07:56:43
推荐回答(2个)
回答(1):

public void UpdateSubTasks(DataTable dtSubTasks,string strEmpName)
{
DBOpen();
System.Data.SqlClient.SqlTransaction Trans;
Trans = cn.BeginTransaction("UpdateSubTasks");

cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = Trans;
cmd.Connection = cn;
try
{
cmd.CommandText = "WM_UpdateSubTasks";

foreach (DataRow dr in dtSubTasks.Rows)
{
if(dr["Buyer"].ToString().Trim()!="")
{
cmd.Parameters.Clear();
cmd.Parameters.Add("@subTaskNo",SqlDbType.VarChar,30).Value = dr["subTaskNo"].ToString().Trim();
cmd.Parameters.Add("@Buyer",SqlDbType.VarChar,20).Value = dr["Buyer"].ToString().Trim();
cmd.Parameters.Add("@Director",SqlDbType.VarChar,20).Value = strEmpName.Trim();
cmd.ExecuteNonQuery();
}
}
Trans.Commit();
}
catch (System.Exception ex)
{
Trans.Rollback();
throw new Exception(ex.Message);
}
finally
{
if(cn.State != ConnectionState.Closed)
{
cn.Close();
}
}

}

回答(2):

给个例子你,例子是使用的DB2数据库,你可以改为其他的,参考着改下就没问题了。
private void button10_Click(object sender, EventArgs e)
{
DbProviderFactory factory = DbProviderFactories.GetFactory(@"IBM.Data.DB2");

DbConnection con = factory.CreateConnection();
con.ConnectionString =
@"Server=192.20.30.167:50000;Database=DEVP;UID=db2;PWD=db2;
CurrentSchema=TK;Connection Lifetime=60;Connection Reset=false;
Max Pool Size=5;Min Pool Size=3;Pooling=True;Connect Timeout=15";

DbCommand cmd = factory.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from tbtickettype";
cmd.Connection = con;
cmd.CommandTimeout = 300;

DbDataAdapter da = factory.CreateDataAdapter();
da.SelectCommand = cmd;

con.Open();
DbTransaction tran = con.BeginTransaction(IsolationLevel.ReadCommitted);
da.SelectCommand.Transaction = tran;//在连接起事务后,必须指定命令的事务
try
{
DataSet ds = new DataSet();
da.Fill(ds);

ds.Tables[0].Rows[0]["TICKETNAME"] = "面部走引组()";
cmd = factory.CreateCommand();
cmd.CommandText = "update tk.TBTICKETTYPE set ticketname = '面部走引组(zzz)' where tickettype = 19";
cmd.Connection = con;
cmd.CommandTimeout = 300;
da.UpdateCommand = cmd;
da.UpdateCommand.Transaction = tran;
int a = da.Update(ds);//只有修改状态的才执行更新语句

DbConnection con1 = factory.CreateConnection();
con1.ConnectionString =
@"Server=172.20.30.107:50000;Database=BL_DEVP;UID=db2inst1;PWD=db2;
CurrentSchema=TK;Connection Lifetime=60;Connection Reset=false;
Max Pool Size=5;Min Pool Size=3;Pooling=True;Connect Timeout=15";

DbCommand cmd1 = factory.CreateCommand();
cmd1.CommandType = CommandType.Text;
cmd1.CommandText = "select * from tbtickettype";
cmd1.Connection = con1;
cmd1.CommandTimeout = 300;
da = factory.CreateDataAdapter();
da.SelectCommand = cmd1;
con1.Open();
DbTransaction tran1 = con1.BeginTransaction(IsolationLevel.ReadUncommitted);//区别就是可以脏读(及能读出事务过程中已经修改但未提交的数据)
da.SelectCommand.Transaction = tran1;
DataSet ds1 = new DataSet();
da.Fill(ds1);
tran1.Commit();
con1.Close();
tran.Commit(); //在提交前如果进行select * from tk.TBTICKETTYPE with ur就能读出尚未提交的更新,实际上就是ReadUnCommitted的效果
MessageBox.Show("OK");
}
catch
{
tran.Rollback();
}
finally
{
tran.Dispose();
con.Close();
}
}