?
ADO.NET的SqlServer.NET數據提供程序,核心的類有4個,而在這個訂餐系統中,我們只使用了3個,SqlConnection、SqlCommand、SqlDataReader,就是這3個核心類,我們也將要把它們封裝到SQLHelper.cs類中。
?
前面,我們在使用這幾個類訪問數據庫的時候,有人,覺得很簡單;有人,甚至覺得很煩了。
?
我們再送它們幾程吧,不由得想起了那句詩:
歡迎轉載,轉載請注明出處.更多文章請參閱博客 http://blog.csdn.com/yousuosi
?
?
?
輕輕的我走了,
正如我輕輕的來;
?
我輕輕的招手,
作別西天的云彩……
?
?
四相送,送到代碼頁里的類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"; //使用靜態類,應用程序運行的時候,它就存在于內存中了,所以,也就不需要再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(); } } //這個類是靜態的,應用程序啟動時,自動駐留在內存中,所建連接,在使用過程中, //也只是Close(),放回到連接池中。并沒有注銷Dispose(),可以下次連接時,快速使用。 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); //如果創建了 SqlDataReader 并將 CommandBehavior 設置為 CloseConnection, //則關閉 SqlDataReader 會自動關閉此連接。 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文件夾中的類SQLHelper.cs中。
第一次在Web中添加類,會提示建立文件夾App_Code,放在這個文夾中的類,使用起來,和前面放在主頁中沒有任何區別,不需要添加引用,也不需要using…
using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; namespace WestGarden.Web { /// <summary> /// SQLHelper 的摘要說明 /// </summary> //這個類是靜態的,應用程序啟動時,自動駐留在內存中,所建連接,在使用過程中, //也只是Close(),放回到連接池中。并沒有注銷Dispose(),可以下次連接時,快速使用。 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); //如果創建了 SqlDataReader 并將 CommandBehavior 設置為 CloseConnection, //則關閉 SqlDataReader 會自動關閉此連接。 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); } } } }
?
此時,主頁代碼不需要做任何改變,在這里,就不貼出來了。
?
六相送,送到類庫DBUtility中的類SQLHelper.cs中。
把類建立在類庫DBUtility中,使用起來就不一樣了。第一,要在Web中添加引用→項目→DBUtility;第二,要使用using WestGarden.DBUtility。使用類庫中的類,都需要這么兩步,如果這兩步都不少,還是出錯的話,那,極有可能是這個類庫單獨編譯就沒有通過,沒有生成dll文件。
using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Collections; namespace WestGarden.DBUtility { /// <summary> /// SQLHelper 的摘要說明 /// </summary> //這個類是靜態的,應用程序啟動時,自動駐留在內存中,所建連接,在使用過程中, //也只是Close(),放回到連接池中。并沒有注銷Dispose(),可以下次連接時,快速使用。 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); //如果創建了 SqlDataReader 并將 CommandBehavior 設置為 CloseConnection, //則關閉 SqlDataReader 會自動關閉此連接。 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); } } } }
?
此時,主頁代碼,只多了一句using WestGarden.DBUtility;在我們這個訂餐系統中,類別表主要使用了兩種呈現方式:下拉列表框和Repeater,這里,我們把使用Repeater的后臺代碼貼一下吧,前臺代碼,就略了…
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"; //使用靜態類,可直接調用,不需要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(); } } }
?
一點說明:
類庫DBUtility中的SQLHelper.cs,使用了抽象類和靜態函數。這個類,使用的時候,不需要實例化,可以直接調用。但,還不完全是微軟的SQLHelper,進一步的改進,是把連接字符串放在Web.config文件中,并建立了連接池,而在SQLHelper中讀出來,放在靜態的字符串中。這會進一步改進它的性能。
另:我們目前使用的這個SQLHelper,似乎并不是微軟的最新版本,最新版本的SQLHelper又做了哪些改進,它的詳細的運行機制怎么樣,有待于大家共同的探討哈...
?更多文章請參閱博客 http://blog.csdn.com/yousuosi
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
