亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

如何寫好SqlHelper 之終章

系統 2398 0

精簡的美麗......

標題有點大。但是,我覺得99%的接近了。

好了,下面我們來說說一個SqlHelper為了適應各種不同的業務需要,它應該具備哪些基本要素。

第一點、可控的事務。

事務是數據庫操作的關鍵部分,在對數據庫進行插入、修改、刪除時都會用到;事務是基于數據庫連接的。一個事務必須要運行在一個連接上,但一個連接上可以有多個事務。

可控的事務就是你在進行數據的增刪改時需要一個事務來進行輔助,當操作出錯時將修改的數據還原。類似下面的過程

      
        transaction.begin();

    ...
      
      
        do
      
      
         something...

transaction.commit();

or error

transaction.rollback();
      
    

當然,你會說,我有部分代碼不需要事務。對!向操作日志之類的東西,只要你的語句沒錯,不管其它的操作成功與否都需要寫入數據庫。這樣的操作就可以護理事務了。

可控的事務其它隱匿包含兩種操作。一種是普通的單表增刪改操作。一種是多表增刪改操作,多見于主從表。

那么,我們需要使用兩套(標準或)代碼來對以上兩種情況進行處理嘛?

第二點,多樣的輸入方式。

何為輸入方式?哈哈,這個很簡單嘛!CommandText 與 Parameters。數據庫管理系統發展到今天早已經超出使用sql命令的范圍,在NoSql數據庫越來越成熟的情況下,關系型數據庫卻依然是主流。所以,哈哈。我們還是談CommandText 與 Parameters。

向數據庫發現Sql命令的方法只有通過文本的形式,然后Parameters的使用卻可以為編程以及數據庫安全提供幫助。例如:

      
        var
      
       sql = 
      
        new
      
      
         StringBuilder();

            sql.Append(
      
      
        "
      
      
         INSERT INTO xACCOUNT
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
             (USERID,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              ACCOUNT,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              EMAIL,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              STATE,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              PWD,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              CREATEOPTION,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              PROPERTY,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              JOINDATE,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              ATTENMODE)
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
         VALUES
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
             (:pUSERID,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pACCOUNT,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pEMAIL,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pSTATE,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pPWD,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pCREATEOPTION,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pPROPERTY,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pJOINDATE,
      
      
        "
      
      
        );

            sql.Append(
      
      
        "
      
      
              :pATTENMODE)
      
      
        "
      
      
        );

            
      
      
        return
      
       sql.ToString();
    

如果你需要向數據庫中連接插入1W條數據,我想你第一想到的應該是使用帶參數的insert語句。為什么?直白點說,數據庫對這條語句做出了優化。如果你需要向數據庫插入10w以上的數據,那么就不要用這個方法了。有個以datatable方式插入的方法,秒級。

數據安全方面,這個最普通的說法是防止惡意sql語句攻擊。百度一下應該大把資料。

第三點,高復雜度與低耦合。

什么是高復雜度。即:所有對數據庫的操作高度封裝。再解釋:.net提供了數據操作的接口對象,如Connectin,Command,Transaction,DataReader,DataAdapter,DataSet,DataTable,Parameter等等對象。這些幾乎是數據庫操作時必不可少的元素。然后這些對象對于我們的開發來說還是過于分散,因為我們更多的是關心操作的結果。所以,將它們再次封裝后,只留下,DataSet,DataTable,DataReader,Execute(),ExecuteScalar()就足夠我們使用的了。

什么是低耦合。即:業務類只做業務邏輯相關的事,將數據處理交給數據處理層去做(純廢話,大家都知道的)。這個要怎么實現?

?

下面,我來展示兩個圖一個文件列表。通過這些來說明上述三點是如何實現的。

圖一,類模型

從這個圖,你能看到各對象之間的關聯。按照.net一個對象一個文件的作法。這也表示,我的文件列中有6個文件。

圖二,類結構圖。哈哈,這是你最次要想知道的。你最想要知道的是我的代碼是什么?有沒有可以下載的地方?

最后是文件列表,

?

下面我將正向的介紹這6個文件(類)

1、ErrorObject 。業務基類(blo)的基類。 用于描述錯誤信息。它很簡單只有兩個屬性一個方法。

  屬性: IsSucceed,用于判斷一個(系列)業務操作是否成功。

  屬性:ErrorCode,表示出錯的代碼。這里只存儲出錯代碼。具體出錯信息需要另行存儲,以方便管理。

?

2、Blo 。業務類的基類 。所有的業務類需要從這里繼承。為什么?還記得“可控事務”最后的問題嘛!這個就是答案。

2.1 獨立業務操作

  設:

              
                public
              
              
                class
              
              
                 TestA : Blo

{



    
              
              
                public
              
              
                bool
              
               Add(
              
                object
              
              
                 obj)

   {

        Transaction.Begin();

        
              
              
                try
              
              
                

        {

             ............

             Transaction.Commit();

        }

        
              
              
                catch
              
              
                 (Exception ex)

        { 

                Transaction.RollBack();

                ErrorCode 
              
              = -
              
                1111
              
              
                ;

                
              
              
                throw
              
              
                ;

        }

   }

}
              
            

?

這里業務類 TestA 的操作在自己的事務過程中

2.2 大事務業務操作。

              
                public
              
              
                class
              
              
                 TestB : Blo

{



    
              
              
                public
              
              
                bool
              
               Add(
              
                object
              
              
                 obj)

   {

        Transaction.Begin();

        
              
              
                try
              
              
                

        {
                
      ...... var ta = new TestA();
Transaction .AddBusiness( ta );
        ta.Add(obj); Transaction.Commit(); }
catch (Exception ex) { Transaction.RollBack(); ErrorCode = - 1111 ; throw ; } } }

?

這里業務類 TestB 的操作在自己的事務過程中。而 TestA 的操作則在TestB的事務過程里。對,沒錯,它們共享了一個事務過程。

?共享事務過程的辦法就是 Transaction 要做的事了。這個過會再講。

?

3、Dao 數據訪問層。 說白了就是寫sql語句的地方。

在這里你可以直接寫sql語句,也可以使用參數的形式。不管使用哪種方法,最終的目的是通過制造sql命令,使用OracleHelper對數據庫進行操作,并將得到的結果返回給blo層。

上一個直接sql的代碼片段

      
        using
      
       (
      
        var
      
       helper = 
      
        new
      
       OracleHelper { ConnectionString = txtOracle.Text, CommandText =
      
         txtSql.Text })

            {

                
      
      
        var
      
       dt =
      
         helper.GetDataTable();

                
      
      
        if
      
       (dt != 
      
        null
      
       && dt.Rows.Count > 
      
        0
      
      
        )

                {

                    
      
      
        foreach
      
       (DataRow row 
      
        in
      
      
         dt.Rows)

                    {

                        lbResult.Items.Add(row.Field
      
      <
      
        string
      
      >(
      
        "
      
      
        TABLE_NAME
      
      
        "
      
      ) + 
      
        "
      
      
        \t
      
      
        "
      
       + row.Field<
      
        string
      
      >(
      
        "
      
      
        COMMENTS
      
      
        "
      
      
        ));

                    }

                }

            }
      
    

?

4、ParameterList。 參數列表對象。

這個對象,在我的上一版本是沒有的。之所以現在增加,是因為我在最近寫一個導入工具時發現,我原來寫的那個helper在對參數進行操作時只能一次性操作。即AddParameter方法只會在調用時才能賦值,而不能在第二次以上的循環中對其賦值。且不能保存對參數列表的引用。

對象中加入了屬性操作

      
        public
      
       OracleParameter 
      
        this
      
      [
      
        string
      
       parameterName] 
    

?

以通過參數名稱來快速檢索參數對象。內部存儲使用的是 Dictionary 對象。

同時對象增加了 CopyTo 方法,可以將參數對象全部導出。

5、Transaction 業務邏輯中的事務控制器。

此對象為事務共享時控制是否共用同一事務的關鍵。主要的方法為

      
        public
      
      
        void
      
       AddBusiness(Blo business)
    

?

將多個需要共享事務的業務對象放到同一事務中。屬性?

      
        public
      
      
        bool
      
       IsRelated { 
      
        get
      
      ;
      
        private
      
      
        set
      
      ; }
    

?

用于判斷是否為共享事務。這個屬性為只讀的。當業務類進行事務操作時,判斷IsRelated是否為true。若為True則跳過事務處理(其實它沒有自己的事務處理過程,所以也就沒辦法提交,只能跳過)。

6、OracleHelper 數據庫處理類。

本文的重點,也是大家最熟悉的。每個人的處理方式不同。但接口只要差不多就行了。略過。

?

最后,你最關心的問題,代碼在哪里,哪里可以下載!哈哈。。。哈哈。。。

我在這只能說抱歉了。授人以魚,不如授人以漁。在我這個文的基本上,你動動手,活動活動腦子,我想也能搞個八 九 不 離 十 吧。

別太懶了。

?

如何寫好SqlHelper 之終章


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久日韩| 国产精品麻豆久久99 | 国内精品免费一区二区观看 | 涩涩色中文综合亚洲 | 国产在线视频精品视频免费看 | 韩日性视频 | 亚洲国产成人久久笫一页 | 日韩久久一区二区三区 | 亚洲欧美日韩国产综合 | 亚洲国产天堂久久综合 | 香蕉视频一区二区三区 | 一级一级18女人毛片 | 亚洲精品久中文字幕 | 国产成人精品免费视频大全办公室 | 日本婷婷 | 亚洲图片综合网 | 日本视频a | 中文字幕一区二区三区永久 | 色青青草原桃花久久综合 | 国产高清一级视频在线观看 | 久久久精品在观看999 | 日本欧美精品 | 极品美女一级毛片 | 日韩成人免费视频 | 老子影院午夜伦不卡不四虎卡 | 日本xxxxxbbbbb精品 | 7m凹凸国产刺激在线视频 | 九草在线免费观看 | 欧美丰满大乳大屁股毛片 | 女性一级全黄生活片免费看 | 天天干夜夜草 | 亚洲成a人v | 四虎精品成人a在线观看 | 欧美日韩亚洲精品国产色 | 欧美日韩亚洲国产一区二区综合 | 色视频一区 | 美国黄色大片 | 日韩精品一区二区三区毛片 | 四虎在线影院 | 日韩亚洲欧美在线观看 | 日本大臿亚洲香蕉大片 |