.NET的多種事務處理

Oracle 的事務操做,有時候想在批量操做數據集合的時候,執行一次失敗,即爲了不數據異常,將全部的操做回滾。
.NET給咱們提供了良好的事務操做,Oracle端也有事務操做,能夠靈活使用,此處介紹.NET的事務。

一、.NET事務操做Oracle存儲過程
public string insert_input_attach_info_moto(DataTable dt, string ass_code, string cust_model, string ship_date, string cust_name, string ship_city, string ship_country, string po_cstname, string po_no, string chd_code, ref decimal batch_id) { string rtnMsg = ""; //存儲過程返回信息 OracleConnection conn = (OracleConnection)DataBase.Provider.GetConnection(); //建立並開啓 OracleConnection conn.Open(); //啓動事務 OracleTransaction tran = conn.BeginTransaction(); try { OracleCommand cmd = conn.CreateCommand(); cmd.Transaction = tran; //綁定事務 cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "pkg_name.procedure_name"; //具體的方法 cmd.Parameters.AddWithValue("p_ass_code", ass_code); //參數佔位符 cmd.Parameters.AddWithValue("p_cust_model", cust_model); cmd.Parameters.AddWithValue("p_ship_date", ship_date); cmd.Parameters.AddWithValue("p_cust_name", cust_name); cmd.Parameters.AddWithValue("p_ship_city", ship_city); cmd.Parameters.AddWithValue("p_ship_country", ship_country); cmd.Parameters.AddWithValue("p_po_cstname", po_cstname); cmd.Parameters.AddWithValue("p_po_no", po_no); cmd.Parameters.AddWithValue("p_chd_code", chd_code); cmd.Parameters.AddWithValue("p_batch_id", batch_id); cmd.Parameters.Add("p_msg", OracleType.VarChar, 100); cmd.Parameters[10].Direction = ParameterDirection.Output; foreach(DataRow row in dt.Rows) { cmd.Parameters[0].Value = row["SN"]; //此處是改變的參數,根據實際狀況賦值 cmd.ExecuteNonQuery(); rtnMsg = cmd.Parameters[10].Value.ToString(); //每次執行的返回值,若出現異常,能夠對此值判斷,並確認是否回滾操做 } tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw (ex); } finally { if (conn.State != ConnectionState.Closed) //關閉連接,避免資源浪費 conn.Close(); } return rtnMsg; //對比無事務的 //OracleParameter[] paras = new OracleParameter[] //{ // new OracleParameter("p_ass_code", ass_code), // new OracleParameter("p_cust_model", cust_model), // new OracleParameter("p_ship_date", ship_date), // new OracleParameter("p_cust_name", cust_name), // new OracleParameter("p_ship_city", ship_city), // new OracleParameter("p_ship_country", ship_country), // new OracleParameter("p_po_cstname", po_cstname), // new OracleParameter("p_po_no", po_no), // new OracleParameter("p_chd_code", chd_code), // new OracleParameter("p_batch_id", batch_id), // new OracleParameter("p_msg", OracleType.VarChar, 100) //}; //paras[10].Direction = ParameterDirection.Output; //DataBase.Provider.ExecuteNonQuery(CommandType.StoredProcedure, @"pkg_name.procedure_name", paras); //batch_id = Convert.ToDecimal(paras[9].Value); //return paras[10].Value.ToString(); }

二、數據庫

public string updateSuccessFlag(DataTable dt)
        {
            string rtnMsg = "";
            OracleConnection conn = (OracleConnection)DataBase.Provider.GetConnection();
            conn.Open();
            //啓動事務
            OracleTransaction tran = conn.BeginTransaction();
            try
            {
                OracleCommand cmd = conn.CreateCommand();
                cmd.Transaction = tran;         //綁定事務
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = @"UPDATE table_name d SET d.flag = 1 WHERE d.prodid = :prod_id";

                cmd.Parameters.AddWithValue("prod_id", "");           //參數佔位符

                //cmd.Parameters.Add("p_msg", OracleType.VarChar, 100);
                //cmd.Parameters[10].Direction = ParameterDirection.Output;

                foreach (DataRow dr in dt.Rows)                      //動態參數,咱們參數
                {
                    cmd.Parameters["prod_id"].Value = Convert.ToString(dr["PRODID"]);
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
                rtnMsg = "SUCCESS";
            }
            catch (Exception ex)
            {
                tran.Rollback();
                throw (ex);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return rtnMsg;
        }

3.SQLServer簡單事務ide

//SQL語句事務
 //更新數據到SqlServer
        public string UploadStbDataToHuaWei(DataTable dt)
        {
            string rtnMsg = "";
            //獲取連接,並開啓連接
            SqlConnection conn = (SqlConnection)DataBase.ProviderSQL.GetConnection();
            conn.Open();
            //啓動事務
            SqlTransaction tran = conn.BeginTransaction();
            try
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.Transaction = tran;         //綁定事務
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = @"insert into [database_name].[dbo].[table_name] ([bar_code] ,[type] ,[stb_value],[created_date], [updated_date])
    values(
    @bar_code, @type, @stb_value, GETDATE(),
    GETDATE())";

                cmd.Parameters.AddWithValue("@bar_code", "");               //佔位符
                cmd.Parameters.AddWithValue("@type", "");
                cmd.Parameters.AddWithValue("@stb_value", "");

                foreach (DataRow dr in dt.Rows)
                {
                    ///cmd.Parameters.Add("@bar_code", SqlDbType.VarChar);  //輸出             //SqlServer的事務
                    cmd.Parameters["@bar_code"].Value = Convert.ToString(dr["PRODID"]);
                    cmd.Parameters["@type"].Value = Convert.ToString(dr["TYPES"]);
                    cmd.Parameters["@stb_value"].Value = Convert.ToString(dr["VAL"]);
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
                rtnMsg = "SUCCESS";
            }
            catch (Exception ex)
            {
                tran.Rollback();
                throw (ex);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }
            return rtnMsg;
        }
-------------------------------------------------------------------------------------------------------
//事務的通常寫法和邏輯
SqlConnection conn = DataBase.Provider.GetConnection() as OracleConnection;
//OracleCommand cmd = conn.CreateCommand();
conn.Open();
//...建立數據庫鏈接 cnn
System.Data.SqlClient.SqlTransaction trans = cnn.BeginTransaction();
try
{
    foreach (DataRow dr in dt.Rows)
    {
        cm.CommandText = "update   [表]   set   [數量]   =   @amount   where   productID   =   @productID";
        cm.Parameters.Add("@amount", SqlDbType.Int);
        cm.Parameters["@amount"].Value = Convert.ToInt32(dr["amount"]);
        cm.Parameters.Add("@productID", SqlDbType.VarChar);
        cm.Parameters["@productID"].Value = dr["productID"].ToString();
        cm.ExecuteNonQuery();
    }
    trans.Commit();
}
catch
{
    trans.Rollback();
}分享共進步謝謝閱讀!
相關文章
相關標籤/搜索