導讀:在機房重構的時候,就用到了SQLHelper,但那時候即使把代碼反復看了很多遍,也看了注釋,還和同學交流,也依然是半懂不懂。現在,我再次用到了SQLhelper這個東西,就來說說SQLHelper是怎么構建的。
?
一、Why?(為什么用)
1,首先看普遍性的D層操作
<span style="font-size:18px;"><span style="font-size:24px;">/*********************************************** '類名:Class1* '命名空間:SQLHelper* '創建時間:2015/3/5 13:20:02* '創建人:HXX* '修改時間:* '修改人:* '版本號:4.0.30319.18449* '版權:HHX* '**********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//增添了對數據庫的訪問操作,增添相應的命名空間 //提供對表示 ADO.NET 結構的類的訪問。包含的是一些數據庫操作所需要用到的普通數據,如數據表,數據行等
using System.Data; //為 SQL服務器.NET Framework 數據提供程序。包含有關專門操作SqlServer數據庫的類,如SqlConnection,SqlCommand,SqlDateAdapter等.
using System.Data.SqlClient;
namespace SQLHelper
{ public class SQLHelper { public int ExecuteNonQuery() { //數據庫鏈接字符串 string connStr = @"server=(local);database=newssystem;uid=sa;pwd=123456"; //實例化SQLConnection,并通過字符串鏈接數據庫 SqlConnection conn = new SqlConnection(connStr); //打開鏈接 conn.Open(); //執行的SQL語句 string sql = "insert into category(name)values('hhx')"; //實例化命令(執行SQL,在conn鏈接的數據庫里) SqlCommand cmd = new SqlCommand(sql, conn); //定義變量 int res = cmd.ExecuteNonQuery(); //關閉鏈接 conn.Close(); //返回執行更新行數 return res; } }
}
</span></span>
2,解釋說明
基本上,每次在D層對于數據庫操作,都要經歷這么一個階段:鏈接—打開—執行—關閉—返回。如果只有一個方法,一個類,那么寫一次是不要緊的,但如果有很多的話,就非常的累。這時候,就需要對于每次的數據庫操作進行抽象重構,以便于我們的D層更為輕便。
?
二、重構步驟
1,數據庫的鏈接
首先:每次的操作,都要進行數據庫鏈接,這個公共的特性,可以單寫出一個方法專門進行數據庫鏈接。
<span style="font-size:18px;"><span style="font-size:24px;"> /// <summary>/// 通過構造函數,給SQLHelper的屬性附初值/// </summary>public SQLHelper(){<span style="white-space:pre"> </span>string connStr = @"server=(local);database=newssystem;uid=sa;pwd=123456";<span style="white-space:pre"> </span>SqlConnection conn = new SqlConnection(connStr);}</span></span>
其次:在這里,就已經對于數據庫鏈接進行了初步的精簡。但通過定義變量的方式,又將數據的鏈接寫死在了程序里。所以,為了進一步解耦,需要引入配置文件,便于數據庫的更改。
注意:1,引用命名空間using?System.Configuration,2,配置文件在Web層里自行配置。
<span style="font-size:18px;"><span style="font-size:24px;"><span style="white-space:pre"> </span>public SQLHelper(){string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;conn = new SqlConnection(connStr);}</span></span>
2,打開關閉數據庫
在對數據庫進行鏈接之后,還需要打開它,在對其操作結束后,還要關閉。這是在每一次操作時,都需要用到的,所以,這個地方可以精簡。
<span style="font-size:18px;"><span style="font-size:24px;"><span style="white-space:pre"> </span>private SqlConnection GetConn(){//如果數據庫關閉,則打開if (conn.State == ConnectionState.Closed){conn.Open();}return conn;}</span></span>
三、精簡結果
每次執行的SQL語句,可以通過一個變量從D層傳入,所以在方法中,引入一個形參sql。
<span style="font-size:18px;"><span style="font-size:24px;"> /// 該方法執行傳入的SQL增刪改語句(無參)/// </summary>/// <param name="sql">要執行的SQL增刪改語句或存儲過程</param>/// <returns>返回更新的記錄數</returns>public int ExecuteNonQuery(string sql){int res;try{SqlCommand cmd = new SqlCommand(sql, GetConn());res = cmd.ExecuteNonQuery();}catch (Exception ex){throw ex;}finally{if (conn.State == ConnectionState.Open){conn.Close();}}return res;}
</span></span>
到目前為止,對于SQLHelper的基本精簡編寫,就結束了。
?
四、擴展
在上面,我們使用了Try?Catch語句,但我們發現在最后關閉數據庫的時候,又重復了寫了一遍if語句,那么,這一段有沒有方法精簡呢,答案是:使用Using語句。
PS:在這篇博客中,只是簡單的對于SQLHelper進行了外形上的處理,還有內容上的處理:比如:參數化查詢,執行存儲過程等。敬請期待下一篇吧!
?
五、個人感受
之前一直在用,但一直都不知道它是怎么來的,自己也寫不出來。但真的是:萬丈高樓平地起。帶來了很大便利的SQLHelper,也是一步一步的精簡而來。
?
?
?