1. 程式人生 > >c#+sql事務處理

c#+sql事務處理

sql事務處理

 /// <summary>
        /// 啟用事務提交多條帶引數的SQL語句
        /// </summary>
        /// <param name="mainSql">主表SQL</param>
        /// <param name="mainParam">主表對應的引數</param>
        /// <param name="detailSql">明細表SQL語句</param>
        /// <param name="detailParam">明細表對應的引數</param>
        /// <returns>返回事務是否成功</returns>
        public static bool UpdateByTran(string mainSql, SqlParameter[] mainParam, string detailSql, List<SqlParameter[]> detailParam)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            try
            {
                conn.Open();
                cmd.Transaction = conn.BeginTransaction();//開啟事務
                if (mainSql != null && mainSql.Length != 0)
                {
                    cmd.CommandText = mainSql;
                    cmd.Parameters.AddRange(mainParam);
                    cmd.ExecuteNonQuery();
                }
                foreach (SqlParameter[] param in detailParam)
                {
                    cmd.CommandText = detailSql;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(param);
                    cmd.ExecuteNonQuery();
                }
                cmd.Transaction.Commit();//提交事務
                return true;
            }
            catch (Exception ex)
            {
                if (cmd.Transaction != null)
                {
                    cmd.Transaction.Rollback();//回滾事務
                }

                //將異常資訊寫入日誌 
                string errorInfo = "呼叫UpdateByTran(string mainSql,  SqlParameter[] mainParam,string detailSql ,List <SqlParameter []>detailParam)方法時發生錯誤,具體資訊:" + ex.Message;
                WriteLog(errorInfo);
                throw ex;
            }
            finally
            {
                if (cmd.Transaction != null)
                {
                    cmd.Transaction = null;//清空事務
                }
                conn.Close();
            }
        }

C#中使用
 //讀者借書
        public bool AddBorrowInfo(BorrowInfo objBorrowInfo)
        {
            //主表實現
            string sqlMain = "insert into BorrowInfo(BorrowId, ReaderId, BorrowDate, AdminName_B)values(@BorrowId, @ReaderId, @BorrowDate, @AdminName_B) ";
            SqlParameter[] param = new SqlParameter[]{
             new SqlParameter ("@BorrowId",objBorrowInfo .BorrowId ),
             new SqlParameter ("@ReaderId",objBorrowInfo .ReaderId ),
             new SqlParameter ("@BorrowDate",objBorrowInfo .BorrowDate ),
             new SqlParameter ("@AdminName_B",objBorrowInfo .AdminName_B )
         };
            //副表實現
            string sqlDetail = "insert into BorrowDetail(BorrowId, BookId, BorrowCount, NonReturnCount, Expire)values(@BorrowId, @BookId, @BorrowCount, @NonReturnCount, @Expire)";
            List<BorrowDetail> detailList = objBorrowInfo.DetailList;
            List<SqlParameter[]> paramList = new List<SqlParameter[]>();
            SqlParameter[] paramt = null; 
            foreach (BorrowDetail item in detailList)
            {
                paramt = new SqlParameter[]{
             new SqlParameter ("@BorrowId",item.BorrowId  ),
             new SqlParameter ("@BookId",item.BookId  ),
             new SqlParameter ("@BorrowCount",item.BorrowCount ),
             new SqlParameter ("@NonReturnCount",item.NonReturnCount ),
             new SqlParameter ("@Expire",item.Expire  )
              };
                paramList.Add(paramt);
            }
            //新增借書
            return SQLHelper.UpdateByTran(sqlMain, param, sqlDetail, paramList);
        }