ado.net的簡單數據庫操作(二)之封裝SqlHelperl類


  今天我書接上回,接着昨天的ado.net的數據庫操作的相關知識來講哈!

  從上篇文章給出的實例來看,你一定會發現,操作數據庫其實還挺麻煩的,就連一個最簡單的數據庫操作語句都要包括 定義數據庫連接字符串、創建數據庫連接對象、打開數據庫連接、定義sql語句、實例化操作數據庫操作對象、操作數據庫、關閉數據庫等等步驟。但是,我們接觸項目的時候會發現,數據庫操作是項目中使用最頻繁的功能了,那么有沒有跟簡單的方法去使用數據庫的操作呢?有的,答案當然是,有的!怎么做?把數據庫的操作封裝成一個類呀,這就是我今天要記錄的 封裝SqlHelper類啦,哈哈!

  下面,我一步步來講,如何封裝吧,哈哈!

第一步:添加SqlHelper類

  首先,在項目里右擊 ==》 添加 ==》新建項 ==》類 ==》 命名為 SqlHelper.cs ==》點擊添加,如下圖所示:

 打開后我們就可以開始編寫SqlHeiperl類了。

第二步:確定類中方法的參數

  我們在編寫SqlHelper類時,肯定是希望把固定不變的東西寫在類中,然后把那些變化的,需要我們手動輸入的東西變成參數傳遞進來,那么哪些內容是需要我們通過參數傳進來的呢?根據上一篇對數據庫操作的基本講解,我們知道,應該會有這樣一些參數:

Sql語句:根據要操作的類型不同,sql語句肯定也會不同,insert\delete\update\select,這幾個都不一樣,所以這個sql語句肯定是作為一個參數傳進來的;

Sql語句中的限定條件:執行sql語句時,我們大部分情況下會有某些限定條件吧,比如"刪除id = xxx的那個行"、"查詢某個名字是否存在" 之類的,那么這些限定條件肯定也是要傳進來的。

  上面兩個參數是肯定得有的,另外還有一個東西,它不是需要我們傳進去的參數,而是一個需要我們進行配置的值,那就是數據庫連接字符串conStr,在我的第一篇博客里也提到了這個東西的配置,這是方便我們更改連接的數據庫而設定的一個參數。通常情況下,我們把" Data Source = .;Initial Catalog = 數據庫名;Integrated Security = true" 這串配置信息放到一個叫 App.config的配置文件中,然后在SqlHelper中獲取配置文件里的這個信息 ,然后執行連接數據庫的操作就好了。這樣做的好處是,我們不用在每個SqlHelper方法中定義conStr字符串,那么我們就可以把封裝好的SqlHelper用在任意一個項目和連接任意數據庫了。

以上是確定的幾個參數。下面來具體封裝一下SqlHelper:

第三步:封裝SqlHelper

1.conStr配置

(1)首先,打開App.config文件,然后在下圖所示位置加入如下代碼:

代碼:

 

 <connectionStrings>
    <add name="mssqlserver" connectionString="Data Source = acer-pc; Initial Catalog = FirstDB ; Integrated Security = true"/>
  </connectionStrings>
connectionString = 后面寫你自己的數據庫連接信息

(2)右擊引用 ==》添加引用 ==》程序集 ==》勾選System.Configuration ==》確定:如下圖所示

(3)在SqlHelper中定義連接字符串,代碼如下:

 private static readonly string conStr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;

 

接下來可以開始編寫數據庫操作方法了,上一篇中講了操作數據庫的三種方法,分別是:ExcuteNonQuery\ExcuteScalar\ExcuteReader,那么我們在寫SqlHelper的時候同樣對應要有這三個方法,下面分別介紹三個方法的編寫:

2.ExecuteNonQuery()方法

先給代碼,再逐步解釋哈:

 

 1   public static int ExecuteNonQurey(string sql,params SqlParameter[] pms)
 2         {
 3             using (SqlConnection con = new SqlConnection(conStr))
 4             {
 5                 using (SqlCommand cmd = new SqlCommand(sql,con))
 6                 {
 7                     if (pms != null)
 8                     {
 9                         cmd.Parameters.AddRange(pms); //這個函數是用來添加參數值的,然后傳遞給存儲過程,意思就是把需要的參數放到sql語句的指定位置
10                     }
11                     con.Open();
12                     return cmd.ExecuteNonQuery();
13                 }
14             }
15         }

 

 

 

 首先說返回值,因為ExcuteNonQuery返回的是整形數據,所以返回值肯定是int類型的,然后說下參數呀,第一個是字符串類型(string)的sql語句,而第二個是參數類型(params)的數組,這個我來說一下,因為我學c語言的時候沒見過這個類型,學php的時候也沒見過這個類型,所以有點懵:

params是一個參數數組類型,什么意思呢,就是你可以把各種不同類型,不同數量的參數放到這個數組中進行傳參,這個參數必須是一維數組,就這意思,想要了解更多關於params的同學可以戳這個鏈接:https://www.cnblogs.com/wangliu/p/3876672.html

這就是兩個參數了。

然后接着下面就是按部就班的寫代碼往下走了,到第7行,我們要對參數數組進行校驗,看其是否為空,如果為空,那就啥也不說直接執行就行了,如果不為空,那就得先做一件事,就是把需要的參數放到sql語句的指定位置,讓它去執行就完了。關於Parameters.AddRange()方法的講解可以看這篇博客:https://blog.csdn.net/wang13667539325/article/details/9672829.

3.ExcuteScalar()方法:

同樣還是先上代碼,再逐步解釋啊:

 1  public static object ExecuteScalar(string sql,params SqlParameter[] pms)
 2         {
 3             using (SqlConnection con = new SqlConnection(conStr))
 4             {
 5                 using (SqlCommand cmd = new SqlCommand(sql,con))
 6                 {
 7                     if (pms != null)
 8                     {
 9                         cmd.Parameters.AddRange(pms);
10                     }
11                     con.Open();
12                     return cmd.ExecuteScalar();
13                 }
14 
15             }
16 
17         }

 

說是逐步解釋,其實也沒啥好解釋的吧,這個跟上面那個幾乎一樣,哈哈!

4.Execute.Reader():

第三個略有不同,先看代碼

 1  public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] pms)
 2  {
 3             SqlConnection con = new SqlConnection(conStr);
 4             using (SqlCommand cmd = new SqlCommand(sql,con))
 5             {
 6                 if ( pms != null)
 7                 {
 8                     cmd.Parameters.AddRange(pms);
 9                 }
10                 try
11                 {
12                     con.Open();
13                     return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            //System.Data.CommandBehavior.CloseConnection這個枚舉參數,表示將來使用完畢SqlDataReader后,在關閉reader的同時,在SqlDataReader內部會將關聯的Connection對象也關閉掉 14 15 } 16 catch { 17 con.Close(); 18 con.Dispose(); 19 throw; 20 } 21 } 22 }

 

 這個里面的寫法不太一樣,這里的創建連接數據庫對象時沒有用using,這是為啥呢?

記得我們前面說過,這個方法返回的對象 reader它不是一個裝東西的倉庫,它只是一個紐帶,那么我們返回這個東西后,我們還要用這個東西來從數據庫取值,但是如果用using的話,那默認就是using結束后就把數據庫關掉了,這個時候,數據庫已經關掉了,我們即使得到了返回的這個reader,也沒法用它來取值了,就相當於返回的reader對我們並無卵用了。所以啊,這里連接數據庫的時候,我們就不用using啦。

  那你又要問了,那數據庫用完了難道就不管嗎?當然不是,繼續看后面的代碼,后面有個 try....catch...,try里面有段注釋說明,看到了吧!什么?太小了,看不到,我氣得噴了一口老血,好吧,那我把這句話copy到下面:

  System.Data.CommandBehavior.CloseConnection這個枚舉參數,表示將來使用完畢SqlDataReader后,在關閉reader的同時,在SqlDataReader內部會將關聯的Connection對象也關閉掉,也關閉掉,也關閉掉!

關於SqlHelper的封裝,我就說到這里啦,文中有些地方我寫的時候也不是很懂,但是寫完了就懂了。這里參考了一篇csdn的博客,也是寫封裝SqlHelper,沒我啰嗦,但寫的更全面,附上鏈接:https://blog.csdn.net/langji1234/article/details/44724779 ,有需要的可以戳進去看看哦。

 

 

今天就寫到這里啦,哈哈,菜雞下午要去學點新東西哈哈!

我的QQ:3074596466

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM