?
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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

