ORACEL數據存儲_事務(C#)

       之前一直以爲數據庫中事務的使用就是一個多條語句順序執行的過程,如果其中一條執行出錯,則回執.

       後來做過一些東西,發現認識有點片面,如:當第一條語句執行完成,需要查出第一條語句的主鍵等,即OracleCommand對象執行的可以返回對象等等.這裏面有一個連帶的關係.這裏就當溫習一下事務,代碼如下:

       

//新方法
  public static void newTest()
    {
        string result = "";
        //一個數據庫打開的鏈接
        OracleConnection con = null;
        //要在數據庫中生成的事務
        OracleTransaction trans = null;
        //表示針對數據庫執行的SQL語句或存儲過程
        OracleCommand cmd = null;
        try
        {
            //ConnectionString一般在數據類中定義,定義內容在web.config中
            //public static readonly string ConnectionString = ConfigurationManager.AppSettings["OracleConnectstring"];
            //使用指定的字符串實例化OracleConnection類的實例
            con = new OracleConnection(ConnectionString);
            //打開數據庫鏈接
            con.Open();
            //在數據庫中開啓一個事務
            trans = con.BeginTransaction();

            //創建並返回一個與OracleConnection類關聯的SQL語句對象
            cmd = con.CreateCommand();
            //設置將在其中執行SQL語句的事務
            cmd.Transaction = trans;

            string sql = "select newTest.Nextval from dual";
            //設置針對數據庫執行的SQL語句
            cmd.CommandText = sql;
            //返回SQL語句第一行第一列的值,如果獲得返回值則使用此方法
            object pid = cmd.ExecuteOracleScalar();
            
           [如果不獲得返回值,則可以直接寫  cmd.ExecuteNonQuery(),此方法獲得影響的行數]

            sql = string.Format("insert into newTest(xh,jbsj)values({0},to_date('{1}','yyyy/mm/dd hh24:mi:ss'))",pid,DateTime.Now.ToLocalTime());
            cmd.CommandText = sql
            int count = cmd.ExecuteNonQuery();
          
           [可以定義多條SQL語句,如下格式:sql="xxx"; cmd.CommandText=sql; cmd.ExecuteNonQuery();]

            //提交事務
            trans.Commit();

        }
        catch (Exception ex)
        {
            if (trans != null)
                trans.Rollback();
            result = "";
        }
        finally
        {
            if (cmd != null)
                cmd.Dispose();
            if (trans != null)
                trans.Dispose();
            if (con != null)
                con.Dispose();
        }

    }

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如果,只是單純執行幾個語句,中間不需要其它返回值的話,可以把它寫成一個共用的方法.

 可以把OracleCommand作爲List類的泛型,把語句存入LIST中,然後順序執行,如下:

 List<OracleCommand> list = new List<OracleCommand>();
 //第一條SQL語句
 string updSql = "xxxx";
 list.Add(oracleHelper.CreateCommand(updSql));
 //第二條
 string selSql = "xxxx";
 //可以添加多條等等..
 list.Add(oracleHelper.CreateCommand(insSQL));
//最後執行LIST中存儲的SQL語句
oracleHelper.ExecuteNonQuery(list);
其中oracleHelper爲自己定義的一個類,ExecuteNonQuery()爲自己定義的一個方法,遍歷List中的SQL語句添加到Cmd對象中,方法如下:

 /// <summary>
        /// 對數據庫執行增刪改操作
        /// </summary>
        /// <param name="cmdList">OracleCommand命令集合</param>
        /// <returns>影響的行數</returns>
        public int ExecuteNonQuery(List<OracleCommand> cmdList)
        {
            int count = 0;
            using (OracleConnection conn = new OracleConnection(ConnectionString))
            {
                conn.Open();
                using (OracleTransaction tran = conn.BeginTransaction())
                {
                    try
                    {
                        int cmdCount = cmdList.Count;
                        for (int i = 0; i < cmdCount; i++)
                        {
                            using (OracleCommand cmd = cmdList[i])
                            {
                                cmd.Transaction = tran;
                                cmd.Connection = conn;
                               // cmd = conn.CreateCommand;
                                count += cmd.ExecuteNonQuery();
                            }
                        }
                        tran.Commit();
                    }
                    catch (Exception e)
                    {
                        tran.Rollback();
                        count = 0;
                        parmeterList.Clear();
                        throw e;
                    }
                }
                conn.Close();
            }
            return count;
        }

上面兩種方式目標和步驟其實一樣,留下參考.


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章