BeginTransaction 是从 ADO.NET 集合对象中调用的。
Command 对象需要被分配给这个事务(SqlTransaction 对象)。
Commit 和 Rollback 只在外部方法中被调用。
看看这段代码。它通过重复使用 SqlConnection 和 SqlTransaction 对象运行。这是一个经典的主从设置。主类型是 ColumnHeaderSet
,它包含一个属性:
List<ColumnHeader>
这是详细信息(集合)。
希望这对你有帮助。
-JM
public static int SaveColumnHeaderSet(ColumnHeaderSet set)
{
string sp = ColumnSP.usp_ColumnSet_C.ToString();
SqlCommand cmd = null;
SqlTransaction trans = null;
SqlConnection conn = null;
try
{
conn = SavedRptDAL.GetSavedRptConn();
cmd = new SqlCommand(sp, conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
trans = conn.BeginTransaction();
cmd.Transaction = trans;
cmd.Parameters.AddWithValue("@ColSetName", set.ColSetName);
cmd.Parameters.AddWithValue("@DefaultSet", 0);
cmd.Parameters.AddWithValue("@ID_Author", set.Author.UserID);
cmd.Parameters.AddWithValue("@IsAnonymous", set.IsAnonymous);
cmd.Parameters.AddWithValue("@ClientNum", set.Author.ClientNum);
cmd.Parameters.AddWithValue("@ShareLevel", set.ShareLevel);
cmd.Parameters.AddWithValue("@ID_Type", set.Type);
SqlParameter prm = new SqlParameter();
prm.ParameterName = "@ID_ColSet";
prm.SqlDbType = SqlDbType.Int;
prm.Direction = ParameterDirection.Output;
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery();
int i = Int32.Parse(cmd.Parameters["@ID_ColSet"].Value.ToString());
if (i == 0) throw new Exception("Failed to save ColumnHeaderSet");
set.ColSetID = i;
if (ColumnHeader_Data.SaveColumnHeaderList(set, conn, trans)==false) throw new Exception("Failed to save ColumnHeaderList");
trans.Commit();
return i;
}
catch (Exception e){
trans.Rollback();
throw e;
}
finally{
conn.Close();
}
}
public static bool SaveColumnHeaderList(ColumnHeaderSet set, SqlConnection conn, SqlTransaction trans)
{
string sp = ColumnSP.usp_ColumnList_C.ToString();
SqlCommand cmd = null;
try
{
cmd = new SqlCommand(sp, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans;
cmd.Parameters.Add("@ID_ColSet", SqlDbType.Int);
cmd.Parameters.Add("@ID_ColHeader", SqlDbType.Int);
cmd.Parameters.Add("@Selected", SqlDbType.Bit);
cmd.Parameters.Add("@Position", SqlDbType.Int);
SqlParameter prm = new SqlParameter();
prm.ParameterName = "@ID";
prm.SqlDbType = SqlDbType.Int;
prm.Direction = ParameterDirection.Output;
cmd.Parameters.Add(prm);
foreach (ColumnHeader item in set.ColHeaderList)
{
cmd.Parameters["@ID_ColSet"].Value = set.ColSetID;
cmd.Parameters["@ID_ColHeader"].Value = item.ColHeaderID;
cmd.Parameters["@Selected"].Value = item.Selected;
cmd.Parameters["@Position"].Value = item.Position;
cmd.ExecuteNonQuery();
int i = Int32.Parse(cmd.Parameters["@ID"].Value.ToString());
if (i == 0) throw new Exception("Failed to save ColumnHeaderSet");
}
return true;
}
catch (Exception e)
{
throw e;
}
}