?
ADO.NET的SqlServer.NET數(shù)據(jù)提供程序,核心的類(lèi)有4個(gè),而在這個(gè)訂餐系統(tǒng)中,我們只使用了3個(gè),SqlConnection、SqlCommand、SqlDataReader,就是這3個(gè)核心類(lèi),我們也將要把它們封裝到SQLHelper.cs類(lèi)中。
?
前面,我們?cè)谑褂眠@幾個(gè)類(lèi)訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,有人,覺(jué)得很簡(jiǎn)單;有人,甚至覺(jué)得很煩了。
?
我們?cè)偎退鼈儙壮贪桑挥傻孟肫鹆四蔷湓?shī):
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處.更多文章請(qǐng)參閱博客 http://blog.csdn.com/yousuosi
?
?
?
輕輕的我走了,
正如我輕輕的來(lái);
?
我輕輕的招手,
作別西天的云彩……
?
?
四相送,送到代碼頁(yè)里的類(lèi)SQLHelper中
using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections.Generic; using WestGarden.Model; namespace WestGarden.Web { public partial class Default6 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList<CategoryInfo> catogories = new List<CategoryInfo>(); string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString; string cmdText = "SELECT * FROM Category"; //使用靜態(tài)類(lèi),應(yīng)用程序運(yùn)行的時(shí)候,它就存在于內(nèi)存中了,所以,也就不需要再new了。 SqlDataReader rdr = SqlHelper.ExecuteReader(connectionString, CommandType.Text, cmdText,null); while (rdr.Read()) { CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2)); catogories.Add(category); } rdr.Close(); ddlCategories.DataSource = catogories; ddlCategories.DataTextField = "Name"; ddlCategories.DataValueField = "CategoryId"; ddlCategories.DataBind(); } } //這個(gè)類(lèi)是靜態(tài)的,應(yīng)用程序啟動(dòng)時(shí),自動(dòng)駐留在內(nèi)存中,所建連接,在使用過(guò)程中, //也只是Close(),放回到連接池中。并沒(méi)有注銷(xiāo)Dispose(),可以下次連接時(shí),快速使用。 public abstract class SqlHelper { public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); try { //cmd.Connection = conn; //cmd.CommandType = cmdType; //cmd.CommandText = cmdText; //conn.Open(); PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection, //則關(guān)閉 SqlDataReader 會(huì)自動(dòng)關(guān)閉此連接。 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } //finally //{ // conn.Close(); //} } private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null) { foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } } }
?
五相送,送到App_Code文件夾中的類(lèi)SQLHelper.cs中。
第一次在Web中添加類(lèi),會(huì)提示建立文件夾App_Code,放在這個(gè)文夾中的類(lèi),使用起來(lái),和前面放在主頁(yè)中沒(méi)有任何區(qū)別,不需要添加引用,也不需要using…
using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; namespace WestGarden.Web { /// <summary> /// SQLHelper 的摘要說(shuō)明 /// </summary> //這個(gè)類(lèi)是靜態(tài)的,應(yīng)用程序啟動(dòng)時(shí),自動(dòng)駐留在內(nèi)存中,所建連接,在使用過(guò)程中, //也只是Close(),放回到連接池中。并沒(méi)有注銷(xiāo)Dispose(),可以下次連接時(shí),快速使用。 public abstract class SqlHelper { public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); try { //cmd.Connection = conn; //cmd.CommandType = cmdType; //cmd.CommandText = cmdText; //conn.Open(); PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection, //則關(guān)閉 SqlDataReader 會(huì)自動(dòng)關(guān)閉此連接。 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } //finally //{ // conn.Close(); //} } private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null) { foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } } }
?
此時(shí),主頁(yè)代碼不需要做任何改變,在這里,就不貼出來(lái)了。
?
六相送,送到類(lèi)庫(kù)DBUtility中的類(lèi)SQLHelper.cs中。
把類(lèi)建立在類(lèi)庫(kù)DBUtility中,使用起來(lái)就不一樣了。第一,要在Web中添加引用→項(xiàng)目→DBUtility;第二,要使用using WestGarden.DBUtility。使用類(lèi)庫(kù)中的類(lèi),都需要這么兩步,如果這兩步都不少,還是出錯(cuò)的話,那,極有可能是這個(gè)類(lèi)庫(kù)單獨(dú)編譯就沒(méi)有通過(guò),沒(méi)有生成dll文件。
using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; namespace WestGarden.DBUtility { /// <summary> /// SQLHelper 的摘要說(shuō)明 /// </summary> //這個(gè)類(lèi)是靜態(tài)的,應(yīng)用程序啟動(dòng)時(shí),自動(dòng)駐留在內(nèi)存中,所建連接,在使用過(guò)程中, //也只是Close(),放回到連接池中。并沒(méi)有注銷(xiāo)Dispose(),可以下次連接時(shí),快速使用。 public abstract class SqlHelper { public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); try { //cmd.Connection = conn; //cmd.CommandType = cmdType; //cmd.CommandText = cmdText; //conn.Open(); PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //如果創(chuàng)建了 SqlDataReader 并將 CommandBehavior 設(shè)置為 CloseConnection, //則關(guān)閉 SqlDataReader 會(huì)自動(dòng)關(guān)閉此連接。 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } //finally //{ // conn.Close(); //} } private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null) { foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } } }
?
此時(shí),主頁(yè)代碼,只多了一句using WestGarden.DBUtility;在我們這個(gè)訂餐系統(tǒng)中,類(lèi)別表主要使用了兩種呈現(xiàn)方式:下拉列表框和Repeater,這里,我們把使用Repeater的后臺(tái)代碼貼一下吧,前臺(tái)代碼,就略了…
sing System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections.Generic; using WestGarden.Model; using WestGarden.DBUtility; namespace WestGarden.Web { public partial class Default8 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList<CategoryInfo> catogories = new List<CategoryInfo>(); string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString; string cmdText = "SELECT * FROM Category"; //使用靜態(tài)類(lèi),可直接調(diào)用,不需要new。 SqlDataReader rdr = SqlHelper.ExecuteReader(connectionString, CommandType.Text, cmdText,null); while (rdr.Read()) { CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2)); catogories.Add(category); } rdr.Close(); repCategories.DataSource = catogories; repCategories.DataBind(); } } }
?
一點(diǎn)說(shuō)明:
類(lèi)庫(kù)DBUtility中的SQLHelper.cs,使用了抽象類(lèi)和靜態(tài)函數(shù)。這個(gè)類(lèi),使用的時(shí)候,不需要實(shí)例化,可以直接調(diào)用。但,還不完全是微軟的SQLHelper,進(jìn)一步的改進(jìn),是把連接字符串放在Web.config文件中,并建立了連接池,而在SQLHelper中讀出來(lái),放在靜態(tài)的字符串中。這會(huì)進(jìn)一步改進(jìn)它的性能。
另:我們目前使用的這個(gè)SQLHelper,似乎并不是微軟的最新版本,最新版本的SQLHelper又做了哪些改進(jìn),它的詳細(xì)的運(yùn)行機(jī)制怎么樣,有待于大家共同的探討哈...
?更多文章請(qǐng)參閱博客 http://blog.csdn.com/yousuosi
輕輕的我走了,正如我輕輕的來(lái)…——ADO.NET核心類(lèi)的滅度與SQLHelper的誕生——十八相送(下)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(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ì)您有幫助就好】元
