數據庫操作類(lèi)的封裝詳解
如果你經(jīng)常從事基于.NET的應用程序的數據庫開(kāi)發(fā),你會(huì )有這種感覺(jué)--總是覺(jué)得自己在反復編寫(xiě)相同的數據訪(fǎng)問(wèn)代碼。很多相似的代碼每天在復制來(lái),粘貼去。你是否想過(guò)將數據訪(fǎng)問(wèn)代碼包裝在一個(gè)Helper函數里,以便能夠在不同的類(lèi)中共用?如果你還沒(méi)有這樣做,那么我這里就告訴你如何從復用的角度來(lái)設計和包裝一個(gè)我們自己的數據訪(fǎng)問(wèn)類(lèi),從而減少冗余代碼,提高開(kāi)發(fā)效率。(本節代碼位置:光盤(pán)\code\ch05\02)
5.2.1 執行命令方法的封裝
當我們執行增加、更新、刪除命令的時(shí)候,一般會(huì )這樣來(lái)寫(xiě):
- string conString = "data source=127.0.0.1;database=codematic;user
id=sa;- password=";
- SqlConnection myConnection = new SqlConnection(conString );
- string strSql = "update P_Product set Name='電腦3' where Id=52";
- SqlCommand myCommand = new SqlCommand(strSql, myConnection);
- myConnection.Open();
- int rows = myCommand.ExecuteNonQuery();
- myConnection.Close();
如果是很多個(gè)這樣的操作,那么我們就需要寫(xiě)很多基本相似的代碼。根據面對對象的抽象原則,在這些操作里面有很多共性的東西,唯一的不同就是conString和strSql。那我是不是可以將共性的東西抽象出來(lái)將其封裝為所有操作所共用呢?
我們把共性的東西抽象出一個(gè)獨立方法:
- //<summary>
- //執行SQL語(yǔ)句,返回影響的記錄數
- //</summary>
- public int ExecuteSql(string StrSql, string conString)
- {
- using (SqlConnection connection = new SqlConnection(conString))
- {
- using (SqlCommand cmd = new SqlCommand(StrSql, connection))
- {
- connection.Open();
- int rows = cmd.ExecuteNonQuery();
- return rows;
- }
- }
- }
這樣,實(shí)際調用的代碼就可以變成:
- string conString="data source=127.0.0.1;database=codematic;user
id=sa;- password=";
- string strSql = "update P_Product set Name='電腦3' where Id=52";
- int rows =ExecuteSql(strSql, conString);
是不是簡(jiǎn)單了很多?可以讓其他類(lèi)共用這個(gè)方法,重復代碼少了,工作效率提高了。
如果所連數據庫都是固定不變的,也就是說(shuō)連接字符串一般不變,那么我們可以將conString 提取出來(lái)放到一個(gè)變量里面,所有的方法都用這個(gè)變量。想改變數據庫時(shí),直接修改變量的內容即可,在實(shí)際調用的時(shí)候不需要傳連接字符串,是不是又省了一步?為了更好地復用,我們還可以將該方法放到單獨的類(lèi)DbHelperSQL里面去。
DbHelperSQL類(lèi)中:
為了使用方便和節省資源,我們將變量和方法設計成靜態(tài)的。此時(shí)的調用就變成了:
- public class DbHelperSQL
- {
- public static string conString = "data source=127.0.0.1;
- database=codematic;user id=sa;password=";
- //<summary>
- //執行SQL語(yǔ)句,返回影響的記錄數
- //</summary>
- //<param name="StrSql">SQL語(yǔ)句</param>
- //<returns>影響的記錄數</returns>
- public static int ExecuteSql(string StrSql)
- {
- using (SqlConnection connection = new SqlConnection(conString))
- {
- using (SqlCommand cmd = new SqlCommand(StrSql, connection))
- {
- connection.Open();
- int rows = cmd.ExecuteNonQuery();
- return rows;
- }
- }
- }
- }
- string strSql = "update P_Product set Name='電腦3' where Id=52";
- int rows = DbHelperSQL.ExecuteSql(strSql);
為了以后的維護和擴展,數據庫連接字符串最好放在Web.config里面,這樣以后想改數據庫就直接改一下Web.config即可,而無(wú)須重新編譯代碼。
- Web.config加入:
- <appSettings>
- <add key="ConnectionString" value="server=127.0.0.1;
database=codematic;- uid=sa;pwd="/>
- </appSettings>
- 變量獲取該字符串:
- public static string conString = ConfigurationManager.AppSettings
- ["ConnectionString "];
有時(shí)候為了安全,我們可能會(huì )對Web.config中的連接字符串進(jìn)行加密。這樣就需要在獲取連接字符串的時(shí)候進(jìn)行解密。這樣,單憑上面一句代碼可能就無(wú)法解決了,我們還需要單獨的處理方法來(lái)處理。為了更好地降低耦合性,減少對類(lèi)的依賴(lài),我們可以將獲取數據庫連接字符串的操作單獨放到一個(gè)類(lèi)里面,如PubConstant。這樣以后修改相應的連接規則和加密處理時(shí),直接調用各個(gè)模塊的這個(gè)類(lèi)就可以了,而并不需要知道實(shí)際的各個(gè)模塊的數據庫訪(fǎng)問(wèn)類(lèi)是怎么獲取的。
例如Web.config的<appSettings>設置:
- <add key="ConStringEncrypt" value="false"/>
- <add key="ConnectionString" value="server=127.0.0.1;database=codematic;
- uid=sa;pwd="/>
- 公共常量類(lèi)獲取并處理:
- public class PubConstant
- {
- //<summary>
- //獲取連接字符串,判斷是否加密處理
- //</summary>
- public static string ConString
- {
- get
- {
- string _conString = ConfigurationManager.AppSettings
["ConString"];- string ConStringEncrypt = ConfigurationManager.AppSettings
- ["ConStringEncrypt"];
- if (ConStringEncrypt == "true")//是加密的
- {
- _conString = DESEncrypt.Decrypt(_conString);//解密
- }
- return _conString;
- }
- }
- }
- 使用連接字符串:
- public static string conString = PubConstant.ConString;
最后的各個(gè)類(lèi)的調用關(guān)系如圖5-7所示。
![]() |
| 圖5-7 執行命令方法的封裝類(lèi)圖 |
聯(lián)系客服