大家或許知道動(dòng)態(tài)網(wǎng)頁(yè)就是需要和服務(wù)器做交互,,并且有數(shù)據(jù)交互的,,所以基本會(huì)用到數(shù)據(jù)庫(kù),世界上有很多種數(shù)據(jù)庫(kù),,但現(xiàn)在最流行的基本是以結(jié)構(gòu)化語(yǔ)句(SQL)作為標(biāo)準(zhǔn)化的關(guān)系型數(shù)據(jù)庫(kù),,比如IBM的DB2、微軟的SQL Server數(shù)據(jù)庫(kù)和Access數(shù)據(jù)庫(kù)甲骨文的Orale數(shù)據(jù)庫(kù),、原Sun公司的MySql數(shù)據(jù)庫(kù)(Sun被甲骨文收購(gòu)了,,現(xiàn)在的MySql數(shù)據(jù)庫(kù)版權(quán)歸甲骨文公司所有,但M7在這里把他歸屬于Sun公司,可以看作是一種歷史),、Sybase公司的Sybase數(shù)據(jù)庫(kù)等等,,這些都是平時(shí)開發(fā)比較常用的數(shù)據(jù)庫(kù),而我等下要公布的超級(jí)DBHelper是建立在SQL Server數(shù)據(jù)庫(kù)基礎(chǔ)上的,,當(dāng)然聰明的朋友可以在using引入的類庫(kù)中其他數(shù)據(jù)庫(kù)的Connection對(duì)象,,這樣就能成為萬(wàn)能的DBHelper。
注意:
1 要使用SqlConnection對(duì)象必須先引入SqlClient命名空間,,SqlClinent是一個(gè)連接SQL Server數(shù)據(jù)庫(kù)的方法的“集合”,,里面有很多種方法只是針對(duì)SQL Server數(shù)據(jù)庫(kù),繼承于Data命名空間,,Data命名空間可以看作是所有數(shù)據(jù)庫(kù)方法的父類,,里面包含7種命名空間,有連接Orale數(shù)據(jù)庫(kù)的命名空間OleDb等等,。
using System.Data.SqlClient;
2 DBHelper一般是作為數(shù)據(jù)訪問(wèn)層(DAL)的一個(gè)類,,也可以看做是一個(gè)寫了很多種方法的“接口”,里面寫了很多種方法便于DAL層中的很多類來(lái)實(shí)現(xiàn),,這樣誰(shuí)要用到這個(gè)方法就調(diào)用DBHelper中的這個(gè)方法,,減少代碼的冗余。
3 訪問(wèn)數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)名、賬戶,、密碼,、域名等等都將存放在Web.config配置文件中,因?yàn)橥獠渴菬o(wú)法訪問(wèn)或下載Web.confige文件的,,而且在不同配置的服務(wù)器中可能密碼或者賬戶不同,,所以可以先在配置文件中配置多個(gè)數(shù)據(jù),只要在DBHelper文件中修改引入的Name就行了,,很方便的一個(gè)使用方法,,所以必須先在DAl層中點(diǎn)擊右鍵——添加引用,會(huì)出現(xiàn)一個(gè)窗體,,如圖:
然后在.NET中尋找System.Configuration,找到之后選中,,點(diǎn)擊確定,,完成。
4 或許有人要問(wèn),,上面的添加引用是干什么的?不添加引用,,我們?cè)趗sing引入中找不到Configuration命名空間,,因?yàn)槲以谏厦嬉矔?huì)說(shuō)了,我們要把密碼等一系列安全級(jí)別較高的數(shù)據(jù)存放在配置文件中,,這個(gè)命名空間的方法是為了在類中讀取配置文件的,,所以必須先添加引用,然后在DB類中引入空間:
using System.Configuration,;
5 以上兩個(gè)命名空間成功引入就可以寫代碼了,,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; using System.Data.SqlClient; using System.Data;
namespace TestPrj //空間名字 TestPrj
{ public class DBHelper //類名 DBHelper {
private static string connStr = ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;
private static SqlConnection conn;
public static SqlConnection Conn { get { if (conn == null) { conn = new SqlConnection(connStr); conn.Open(); } if (conn != null && conn.State != ConnectionState.Closed) { conn.Close(); conn.Open(); } else { conn.Open(); } return DBHelper.conn; } }
/// <summary> /// 關(guān)閉連接 /// </summary> public static void closeConn() { if (Conn != null && Conn.State != ConnectionState.Closed) { Conn.Close(); } }
/// <summary> /// 查詢操作 /// </summary> /// <param name="sql"></param> /// <param name="type"></param> /// <param name="pars"></param> /// <returns></returns> public static SqlDataReader getReader(string sql, CommandType type, params SqlParameter[] pars) { SqlCommand cmd = new SqlCommand(sql, Conn); cmd.CommandType = type; cmd.Parameters.AddRange(pars); return cmd.ExecuteReader(); }
/// <summary> /// 執(zhí)行非查詢操作(執(zhí)行增、刪,、改操作的),,不支持事務(wù) /// </summary> /// <param name="sql"></param> /// <param name="type"></param> /// <param name="pars"></param> /// <returns></returns> public static int ExecuteNoneQuery(string sql, CommandType type, params SqlParameter[] pars) { int result = 0;
SqlCommand cmd = new SqlCommand(sql, Conn); cmd.CommandType = type; if (pars != null) { cmd.Parameters.AddRange(pars); }
result = cmd.ExecuteNonQuery();
//關(guān)閉連接對(duì)象 CloseConn();
return result; }
/// <summary> /// 非查詢操作(執(zhí)行增、刪,、改操作的),,支持事務(wù),進(jìn)行批量操作 /// </summary> /// <param name="sql"></param> /// <param name="conn"></param> /// <param name="type"></param> /// <param name="pars"></param> /// <returns></returns> public static int ExecuteNoneQuery(string sql, SqlConnection conn, CommandType type, params SqlParameter[] pars) { int result = 0;
//接受外部提供的數(shù)據(jù)連接對(duì)象,,并且此連接在本次操作后不要關(guān)閉 SqlCommand cmd = new SqlCommand(sql, conn); cmd.CommandType = type; cmd.Parameters.AddRange(pars);
result = cmd.ExecuteNonQuery();
return result; }
/// <summary> /// 獲取單個(gè)值,,首行首列 /// </summary> /// <param name="sql"></param> /// <param name="type"></param> /// <param name="pars"></param> /// <returns></returns> public static object GetScalar(string sql, CommandType type, params SqlParameter[] pars) { object obj = null;
SqlCommand cmd = new SqlCommand(sql, Conn); cmd.CommandType = type; cmd.Parameters.AddRange(pars);
obj = cmd.ExecuteScalar();
//關(guān)閉連接對(duì)象 CloseConn();
return obj; } } }
//ConfigurationManager 方法:提供對(duì)客戶端應(yīng)用程序配置文件的訪問(wèn),也就是說(shuō)必須通過(guò)這個(gè)方法才能訪問(wèn)Web.config配置文件
//ConnectionStrings 方法有什么用,,干什么的,?我們來(lái)看張圖你就明白了,,打開配置文件找到子節(jié)點(diǎn)<ConnectionStrings/>如圖:
//代碼修改如下:<ConnectionStrings>
// <add name="你要調(diào)用的名字" connectionString="數(shù)據(jù)庫(kù)連接對(duì)象—— 服務(wù)器名 賬戶 密碼 數(shù)據(jù)庫(kù)名" />
// </ConnectionStrings>
// 所以這句你自然就看的懂了 ConfigurationManager.ConnectionStrings["sqlserver"].ConnectionString;
// 在客戶端訪問(wèn)配置文件的方法 點(diǎn)(.) 配置文件中的子節(jié)點(diǎn) ["子節(jié)點(diǎn)中的名字"] 點(diǎn)(.) 相對(duì)的子節(jié)點(diǎn)中的內(nèi)容;
//其中的<add > 可以有多個(gè),,name 不能重復(fù),,其實(shí)name就等于Key ,而后面的ConnectionString就等于Value值,。
//用于配置不同的服務(wù)器名賬戶密碼,,因?yàn)槟汩_發(fā)一個(gè)項(xiàng)目可能你的服務(wù)器名字密碼是sa sa. 但是別人的不一定是這樣的,當(dāng)你的項(xiàng)目在別人的機(jī)器上用的時(shí)候,,只需要之前在添加個(gè)<add>,,把別人的賬戶密碼存放在ConnectionString中就行了,,到時(shí)候在DB中把訪問(wèn)配置文件的名字改成剛添加的<add>中的name就行了,,很方便。
//上面有3個(gè)判斷,,連接對(duì)象是否為空,?連接對(duì)象的狀態(tài)是否為斷開?連接對(duì)象是否為關(guān)閉,?
//如果是空的話,,就實(shí)例化,然后在利用(Open())方法打開連接對(duì)象,。
//如果在斷開狀態(tài),,就先關(guān)閉,在打開,,一定要先關(guān)閉,,斷開不等于關(guān)閉,這個(gè)要注意,。
//如果是關(guān)閉的話,,也就是說(shuō)連接對(duì)象已經(jīng)實(shí)例化成功,但沒(méi)有開啟,,要用就要開啟,,所以直接打開就行了。
//下面還有個(gè)關(guān)閉的方法
//也會(huì)做個(gè)判斷 是否實(shí)例化了,,沒(méi)有實(shí)例化自然沒(méi)有打開,,如果強(qiáng)行關(guān)閉肯定會(huì)拋異常,所以關(guān)閉前必須做判斷,,當(dāng)然如果本來(lái)就是關(guān)閉的狀態(tài),,在去關(guān)閉肯定也會(huì)拋異常,所以我們做了這個(gè)綜合性的判斷,,不在這兩者狀態(tài)下我們才去關(guān)閉連接對(duì)象,。
|