C# C语言中的事务处理#
除此问题外: 我想知道是否可以创建一个包含对数据库的不同调用的事务 例: 我不知道这是否可能。我们正在使用亚音速进行数据库调用。 这真的很重要,不仅对于树遍历问题,而且对于我们所做的其他事情C# C语言中的事务处理#,c#,methods,transactions,C#,Methods,Transactions,除此问题外: 我想知道是否可以创建一个包含对数据库的不同调用的事务 例: 我不知道这是否可能。我们正在使用亚音速进行数据库调用。 这真的很重要,不仅对于树遍历问题,而且对于我们所做的其他事情 主要的想法是我们不能让数据库被不完整的数据破坏。这是可能的,你可以找到一个例子 或者可能是一个事务范围 BeginTransaction被取消ADO.NET集合对象。 命令对象需要分配此事务(SqlTransaction对象)。 提交和回滚仅在外部方法中调用 查看此代码。它通过重新使用SqlConnecti
主要的想法是我们不能让数据库被不完整的数据破坏。这是可能的,你可以找到一个例子 或者可能是一个事务范围
BeginTransaction被取消ADO.NET集合对象。 命令对象需要分配此事务(SqlTransaction对象)。 提交和回滚仅在外部方法中调用 查看此代码。它通过重新使用SqlConnection和SqlTransaction对象来工作。这是一个典型的主>详细设置类型。主类型为
ColumnHeaderSet
,其中包含属性
列表
,这是详细信息(集合)
希望这有帮助。
-吉咪
哦,很抱歉,那么,也许事务范围会有所帮助,我从未使用过这个,但这里有一个链接:
public bool CopyNode(int nodeId, int parentNode)
{
// Begin transaction.
try
{
Method1(nodeId);
Method2(nodeId, parentNode);
Method3(nodeId);
}
catch (System.Exception ex)
{
//rollback all the methods
}
}
public static int SaveColumnHeaderSet(ColumnHeaderSet set)
//save a ColumnHeaderSet
{
string sp = ColumnSP.usp_ColumnSet_C.ToString(); //name of sp we're using
SqlCommand cmd = null;
SqlTransaction trans = null;
SqlConnection conn = null;
try
{
conn = SavedRptDAL.GetSavedRptConn(); //get conn for the app's connString
cmd = new SqlCommand(sp, conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
trans = conn.BeginTransaction();
cmd.Transaction = trans; // Includes this cmd as part of the trans
//parameters
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);
//add output parameter - to return new record identity
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; //update the object
//save the ColumnHeaderList (SetDetail)
if (ColumnHeader_Data.SaveColumnHeaderList(set, conn, trans)==false) throw new Exception("Failed to save ColumnHeaderList");
trans.Commit();
// return ID for new ColHdrSet
return i;
}
catch (Exception e){
trans.Rollback();
throw e;
}
finally{
conn.Close();
}
}
public static bool SaveColumnHeaderList(ColumnHeaderSet set, SqlConnection conn, SqlTransaction trans)
//save a (custom)ColHeaderList for a Named ColumnHeaderSet
{
// we're going to accept a SqlTransaction to maintain transactional integrity
string sp = ColumnSP.usp_ColumnList_C.ToString(); //name of sp we're using
SqlCommand cmd = null;
try
{
cmd = new SqlCommand(sp, conn); // re-using the same conection object
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans; // includes the cmd in the transaction
//build params collection (input)
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);
//add output parameter - to return new record identity
//FYI - @return_value = @ID_SavedRpt
SqlParameter prm = new SqlParameter();
prm.ParameterName = "@ID";
prm.SqlDbType = SqlDbType.Int;
prm.Direction = ParameterDirection.Output;
cmd.Parameters.Add(prm);
//Loop
foreach (ColumnHeader item in set.ColHeaderList)
{
//set param values
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;
}
}