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

如何寫好SqlHelper 之終章

系統(tǒng) 2822 0

精簡(jiǎn)的美麗......

標(biāo)題有點(diǎn)大。但是,我覺(jué)得99%的接近了。

好了,下面我們來(lái)說(shuō)說(shuō)一個(gè)SqlHelper為了適應(yīng)各種不同的業(yè)務(wù)需要,它應(yīng)該具備哪些基本要素。

第一點(diǎn)、可控的事務(wù)。

事務(wù)是數(shù)據(jù)庫(kù)操作的關(guān)鍵部分,在對(duì)數(shù)據(jù)庫(kù)進(jìn)行插入、修改、刪除時(shí)都會(huì)用到;事務(wù)是基于數(shù)據(jù)庫(kù)連接的。一個(gè)事務(wù)必須要運(yùn)行在一個(gè)連接上,但一個(gè)連接上可以有多個(gè)事務(wù)。

可控的事務(wù)就是你在進(jìn)行數(shù)據(jù)的增刪改時(shí)需要一個(gè)事務(wù)來(lái)進(jìn)行輔助,當(dāng)操作出錯(cuò)時(shí)將修改的數(shù)據(jù)還原。類似下面的過(guò)程

      
        transaction.begin();

    ...
      
      
        do
      
      
         something...

transaction.commit();

or error

transaction.rollback();
      
    

當(dāng)然,你會(huì)說(shuō),我有部分代碼不需要事務(wù)。對(duì)!向操作日志之類的東西,只要你的語(yǔ)句沒(méi)錯(cuò),不管其它的操作成功與否都需要寫入數(shù)據(jù)庫(kù)。這樣的操作就可以護(hù)理事務(wù)了。

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

那么,我們需要使用兩套(標(biāo)準(zhǔn)或)代碼來(lái)對(duì)以上兩種情況進(jìn)行處理嘛?

第二點(diǎn),多樣的輸入方式。

何為輸入方式?哈哈,這個(gè)很簡(jiǎn)單嘛!CommandText 與 Parameters。數(shù)據(jù)庫(kù)管理系統(tǒng)發(fā)展到今天早已經(jīng)超出使用sql命令的范圍,在NoSql數(shù)據(jù)庫(kù)越來(lái)越成熟的情況下,關(guān)系型數(shù)據(jù)庫(kù)卻依然是主流。所以,哈哈。我們還是談CommandText 與 Parameters。

向數(shù)據(jù)庫(kù)發(fā)現(xiàn)Sql命令的方法只有通過(guò)文本的形式,然后Parameters的使用卻可以為編程以及數(shù)據(jù)庫(kù)安全提供幫助。例如:

      
        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();
    

如果你需要向數(shù)據(jù)庫(kù)中連接插入1W條數(shù)據(jù),我想你第一想到的應(yīng)該是使用帶參數(shù)的insert語(yǔ)句。為什么?直白點(diǎn)說(shuō),數(shù)據(jù)庫(kù)對(duì)這條語(yǔ)句做出了優(yōu)化。如果你需要向數(shù)據(jù)庫(kù)插入10w以上的數(shù)據(jù),那么就不要用這個(gè)方法了。有個(gè)以datatable方式插入的方法,秒級(jí)。

數(shù)據(jù)安全方面,這個(gè)最普通的說(shuō)法是防止惡意sql語(yǔ)句攻擊。百度一下應(yīng)該大把資料。

第三點(diǎn),高復(fù)雜度與低耦合。

什么是高復(fù)雜度。即:所有對(duì)數(shù)據(jù)庫(kù)的操作高度封裝。再解釋:.net提供了數(shù)據(jù)操作的接口對(duì)象,如Connectin,Command,Transaction,DataReader,DataAdapter,DataSet,DataTable,Parameter等等對(duì)象。這些幾乎是數(shù)據(jù)庫(kù)操作時(shí)必不可少的元素。然后這些對(duì)象對(duì)于我們的開(kāi)發(fā)來(lái)說(shuō)還是過(guò)于分散,因?yàn)槲覀兏嗟氖顷P(guān)心操作的結(jié)果。所以,將它們?cè)俅畏庋b后,只留下,DataSet,DataTable,DataReader,Execute(),ExecuteScalar()就足夠我們使用的了。

什么是低耦合。即:業(yè)務(wù)類只做業(yè)務(wù)邏輯相關(guān)的事,將數(shù)據(jù)處理交給數(shù)據(jù)處理層去做(純廢話,大家都知道的)。這個(gè)要怎么實(shí)現(xiàn)?

?

下面,我來(lái)展示兩個(gè)圖一個(gè)文件列表。通過(guò)這些來(lái)說(shuō)明上述三點(diǎn)是如何實(shí)現(xiàn)的。

圖一,類模型

從這個(gè)圖,你能看到各對(duì)象之間的關(guān)聯(lián)。按照.net一個(gè)對(duì)象一個(gè)文件的作法。這也表示,我的文件列中有6個(gè)文件。

圖二,類結(jié)構(gòu)圖。哈哈,這是你最次要想知道的。你最想要知道的是我的代碼是什么?有沒(méi)有可以下載的地方?

最后是文件列表,

?

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

1、ErrorObject 。業(yè)務(wù)基類(blo)的基類。 用于描述錯(cuò)誤信息。它很簡(jiǎn)單只有兩個(gè)屬性一個(gè)方法。

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

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

?

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

2.1 獨(dú)立業(yè)務(wù)操作

  設(shè):

              
                public
              
              
                class
              
              
                 TestA : Blo

{



    
              
              
                public
              
              
                bool
              
               Add(
              
                object
              
              
                 obj)

   {

        Transaction.Begin();

        
              
              
                try
              
              
                

        {

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

             Transaction.Commit();

        }

        
              
              
                catch
              
              
                 (Exception ex)

        { 

                Transaction.RollBack();

                ErrorCode 
              
              = -
              
                1111
              
              
                ;

                
              
              
                throw
              
              
                ;

        }

   }

}
              
            

?

這里業(yè)務(wù)類 TestA 的操作在自己的事務(wù)過(guò)程中

2.2 大事務(wù)業(yè)務(wù)操作。

              
                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 ; } } }

?

這里業(yè)務(wù)類 TestB 的操作在自己的事務(wù)過(guò)程中。而 TestA 的操作則在TestB的事務(wù)過(guò)程里。對(duì),沒(méi)錯(cuò),它們共享了一個(gè)事務(wù)過(guò)程。

?共享事務(wù)過(guò)程的辦法就是 Transaction 要做的事了。這個(gè)過(guò)會(huì)再講。

?

3、Dao 數(shù)據(jù)訪問(wèn)層。 說(shuō)白了就是寫sql語(yǔ)句的地方。

在這里你可以直接寫sql語(yǔ)句,也可以使用參數(shù)的形式。不管使用哪種方法,最終的目的是通過(guò)制造sql命令,使用OracleHelper對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,并將得到的結(jié)果返回給blo層。

上一個(gè)直接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。 參數(shù)列表對(duì)象。

這個(gè)對(duì)象,在我的上一版本是沒(méi)有的。之所以現(xiàn)在增加,是因?yàn)槲以谧罱鼘懸粋€(gè)導(dǎo)入工具時(shí)發(fā)現(xiàn),我原來(lái)寫的那個(gè)helper在對(duì)參數(shù)進(jìn)行操作時(shí)只能一次性操作。即AddParameter方法只會(huì)在調(diào)用時(shí)才能賦值,而不能在第二次以上的循環(huán)中對(duì)其賦值。且不能保存對(duì)參數(shù)列表的引用。

對(duì)象中加入了屬性操作

      
        public
      
       OracleParameter 
      
        this
      
      [
      
        string
      
       parameterName] 
    

?

以通過(guò)參數(shù)名稱來(lái)快速檢索參數(shù)對(duì)象。內(nèi)部存儲(chǔ)使用的是 Dictionary 對(duì)象。

同時(shí)對(duì)象增加了 CopyTo 方法,可以將參數(shù)對(duì)象全部導(dǎo)出。

5、Transaction 業(yè)務(wù)邏輯中的事務(wù)控制器。

此對(duì)象為事務(wù)共享時(shí)控制是否共用同一事務(wù)的關(guān)鍵。主要的方法為

      
        public
      
      
        void
      
       AddBusiness(Blo business)
    

?

將多個(gè)需要共享事務(wù)的業(yè)務(wù)對(duì)象放到同一事務(wù)中。屬性?

      
        public
      
      
        bool
      
       IsRelated { 
      
        get
      
      ;
      
        private
      
      
        set
      
      ; }
    

?

用于判斷是否為共享事務(wù)。這個(gè)屬性為只讀的。當(dāng)業(yè)務(wù)類進(jìn)行事務(wù)操作時(shí),判斷IsRelated是否為true。若為True則跳過(guò)事務(wù)處理(其實(shí)它沒(méi)有自己的事務(wù)處理過(guò)程,所以也就沒(méi)辦法提交,只能跳過(guò))。

6、OracleHelper 數(shù)據(jù)庫(kù)處理類。

本文的重點(diǎn),也是大家最熟悉的。每個(gè)人的處理方式不同。但接口只要差不多就行了。略過(guò)。

?

最后,你最關(guān)心的問(wèn)題,代碼在哪里,哪里可以下載!哈哈。。。哈哈。。。

我在這只能說(shuō)抱歉了。授人以魚(yú),不如授人以漁。在我這個(gè)文的基本上,你動(dòng)動(dòng)手,活動(dòng)活動(dòng)腦子,我想也能搞個(gè)八 九 不 離 十 吧。

別太懶了。

?

如何寫好SqlHelper 之終章


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 91系列在线 | 中国国语毛片免费观看视频 | 亚洲 欧美 bt | 日本 在线播放 | 高清欧美日本视频免费观看 | 国产青草| 天天综合亚洲 | 亚洲综合久| 久久久99精品 | 国产精品夜色一区二区三区 | 精品精品久久宅男的天堂 | 国产精品久久新婚兰兰 | 亚洲精品爱爱久久 | 国内精品久久久久久久 | 亚洲免费高清 | 四虎精品 | 日韩毛片免费观看 | 欧美一级片免费在线观看 | 亚洲视频一区在线 | 9999久久 | 亚洲国产婷婷香蕉久久久久久 | 国产高清成人mv在线观看 | 毛片网子| 一级全黄色毛片 | 91在线永久 | 亚州中文 | 男女羞羞网站 | 欧美成人久久 | 国产精品亚洲综合色区韩国 | 国产美女一级视频 | 久久爱综合久久爱com | 亚洲国产视频在线观看 | 日本高清不卡码 | 亚洲国产成人精品91久久久 | 日本在线毛片视频免费看 | 色之综综| 成人午夜视频在线播放 | 国产午夜永久福利视频在线观看 | 成人毛片18女人毛片 | 久久厕所精品国产精品亚洲 | 国产日比视频 |