創(chuàng)建公共類(1)
在網(wǎng)站開發(fā)項目中以類的形式來組織、封裝一些常用的方法和事件,將會在編程過程中起到事半功倍的效果。本系統(tǒng)中創(chuàng)建了8個公共類文件,分別為:DataBase.cs(數(shù)據(jù)庫操作類)、AdminManage.cs(管理員功能模塊類)、CardManage.cs(帖子管理功能模塊類)、HostManage.cs(版主管理功能模塊類)、ImageManage.cs(頭像管理功能模塊類)、ModuleManage.cs(版塊管理功能模塊類)、RevertManage.cs(回帖管理功能模塊類)和UserManage.cs(用戶管理功能模塊類)。其中,數(shù)據(jù)層主要用來訪問SQL Server 2005數(shù)據(jù)庫,而其他功能模塊類主要用于處理業(yè)務(wù)邏輯功能,透徹地說,就是實現(xiàn)網(wǎng)頁與數(shù)據(jù)庫操作(數(shù)據(jù)層)之間的業(yè)務(wù)功能。各層之間的理論關(guān)系如圖23.8所示。
|
(點擊查看大圖)圖23.8 各層之間關(guān)系圖 |
創(chuàng)建類文件的方法為:在ASP.NET集成開發(fā)環(huán)境Visual Studio 2008的菜單中選擇"項目"/"添加新項"命令,在彈出的"添加新項"對話框中選擇"類"選項,并修改名稱為DataBase.cs,如圖23.9所示。
注意:在ASP.NET中,App_Code文件夾專門用來存放一些應(yīng)用于全局的代碼(如公共類),如果沒有,可以在該項目上單擊鼠標右鍵,在彈出的快捷菜單中選擇"添加ASP.NET文件夾"/"App_Code"命令,添加一個App_Code文件夾。
|
(點擊查看大圖)圖23.9 創(chuàng)建類文件 |
1.數(shù)據(jù)庫操作類設(shè)計
數(shù)據(jù)庫操作類主要實現(xiàn)的功能有:打開數(shù)據(jù)庫連接、關(guān)閉數(shù)據(jù)庫連接、釋放數(shù)據(jù)庫連接資源、傳入?yún)?shù)并且轉(zhuǎn)換為SqlParameter類型、執(zhí)行參數(shù)命令文本(無返回值)、執(zhí)行參數(shù)命令文本(有返回值)、將命令文本添加到SqlDataAdapter和將命令文本添加到SqlCommand。下面給出所有的數(shù)據(jù)庫操作類源代碼,并且作出詳細的介紹。
在命名空間區(qū)域引用using System.Data.SqlClient命名空間。為了精確控制釋放未托管資源,必須實現(xiàn)DataBase類的System.IDisposable接口。IDisposable接口聲明了一個方法Dispose,該方法不帶參數(shù),返回Void。
相關(guān)代碼如下:
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using System.Data.SqlClient;
- /// <summary>
- /// DataBase 的摘要說明
- /// </summary>
- public class DataBase:IDisposable
- {
- public DataBase()
- {
- }
- private SqlConnection con; //創(chuàng)建連接對象
- ……
- ……下面編寫相關(guān)的功能方法
- ……
- }
建立數(shù)據(jù)的連接主要通過SqlConnection類實現(xiàn),并初始化數(shù)據(jù)庫連接字符串,然后通過State屬性判斷連接狀態(tài),如果數(shù)據(jù)庫連接狀態(tài)為關(guān),則打開數(shù)據(jù)庫連接。
實現(xiàn)打開數(shù)據(jù)庫連接Open方法的代碼如下:
- #region 打開數(shù)據(jù)庫連接
- /// <summary>
- /// 打開數(shù)據(jù)庫連接
- /// </summary>
- private void Open()
- {
- if (con == null) // 打開數(shù)據(jù)庫連接
- {
- con = new SqlConnection(ConfigurationManager.
AppSettings["ConnectionString"]); - }
- if (con.State == System.Data.ConnectionState.Closed)
- con.Open();
- }
- #endregion
關(guān)閉數(shù)據(jù)庫連接主要通過SqlConnection對象的Close方法實現(xiàn)。自定義Close方法關(guān)閉數(shù)據(jù)庫連接的代碼如下:
- #region 關(guān)閉連接
- /// <summary>
- /// 關(guān)閉數(shù)據(jù)庫連接
- /// </summary>
- public void Close()
- {
- if (con != null)
- con.Close();
- }
- #endregion
因為DataBase類使用System.IDisposable接口,IDisposable接口聲明了一個方法Dispose,所以在此應(yīng)完善IDisposable接口的Dispose方法,用來釋放數(shù)據(jù)庫連接資源。
創(chuàng)建公共類(2)
實現(xiàn)釋放數(shù)據(jù)庫連接資源的Dispose方法代碼如下: - #region 釋放數(shù)據(jù)庫連接資源
- /// <summary>
- /// 釋放資源
- /// </summary>
- public void Dispose()
- {
- // 確認連接是否已經(jīng)關(guān)閉
- if (con != null)
- {
- con.Dispose();
- con = null;
- }
- }
- #endregion
本系統(tǒng)向數(shù)據(jù)庫中讀寫數(shù)據(jù)是以參數(shù)形式實現(xiàn)的。MakeInParam方法用于傳入?yún)?shù),而MakeParam方法用于轉(zhuǎn)換參數(shù)。
實現(xiàn)MakeInParam方法和MakeParam方法的完整代碼如下: - #region 傳入?yún)?shù)并且轉(zhuǎn)換為SqlParameter類型
- /// <summary>
- /// 傳入?yún)?shù)
- /// </summary>
- /// <param name="ParamName">存儲過程名稱或命令文本</param>
- /// <param name="DbType">參數(shù)類型</param></param>
- /// <param name="Size">參數(shù)大小</param>
- /// <param name="Value">參數(shù)值</param>
- /// <returns>新的parameter 對象</returns>
- public SqlParameter MakeInParam(string ParamName,
SqlDbType DbType, int Size, object Value) - {
- return MakeParam(ParamName, DbType, Size,
ParameterDirection.Input, Value); - }
- /// <summary>
- /// 初始化參數(shù)值
- /// </summary>
- /// <param name="ParamName">存儲過程名稱或命令文本</param>
- /// <param name="DbType">參數(shù)類型</param>
- /// <param name="Size">參數(shù)大小</param>
- /// <param name="Direction">參數(shù)方向</param>
- /// <param name="Value">參數(shù)值</param>
- /// <returns>新的parameter 對象</returns>
- public SqlParameter MakeParam(string ParamName,
SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value) - {
- SqlParameter param;
- if (Size > 0)
- param = new SqlParameter(ParamName, DbType, Size);
- else
- param = new SqlParameter(ParamName, DbType);
- param.Direction = Direction;
- if (!(Direction == ParameterDirection.Output && Value == null))
- param.Value = Value;
- return param;
- }
- #endregion
RunProc方法為可重載方法,功能分別為執(zhí)行帶參數(shù)SqlParameter的命令文本。RunProc(string
procName, SqlParameter[] prams)方法主要用于執(zhí)行添加、修改和刪除;RunProc(string procName)方法用來直接執(zhí)行SQL語句,如數(shù)據(jù)庫備份與數(shù)據(jù)庫恢復。
實現(xiàn)可重載方法RunProc方法的完整代碼如下: - #region 執(zhí)行參數(shù)命令文本(無數(shù)據(jù)庫中數(shù)據(jù)返回)
- /// <summary>
- /// 執(zhí)行命令
- /// </summary>
- /// <param name="procName">命令文本</param>
- /// <param name="prams">參數(shù)對象</param>
- /// <returns></returns>
- public int RunProc(string procName, SqlParameter[] prams)
- {
- SqlCommand cmd = CreateCommand(procName, prams);
- cmd.ExecuteNonQuery();
- this.Close();
- //得到執(zhí)行成功返回值
- return (int)cmd.Parameters["ReturnValue"].Value;
- }
- /// <summary>
- /// 直接執(zhí)行SQL語句
- /// </summary>
- /// <param name="procName">命令文本</param>
- /// <returns></returns>
- public int RunProc(string procName)
- {
- this.Open();
- SqlCommand cmd = new SqlCommand(procName, con);
- cmd.ExecuteNonQuery();
- this.Close();
- return 1;
- }
- #endregion
RunProcReturn方法為可重載方法,返回值為DataSet類型。功能分別為執(zhí)行帶參數(shù)SqlParameter的命令文本。下面代碼中RunProcReturn(string procName, SqlParameter[] prams,string tbName)方法主要用于執(zhí)行帶參數(shù)SqlParameter的查詢命令文本;RunProcReturn(string procName, string tbName)用于直接執(zhí)行查詢SQL語句。 創(chuàng)建公共類(3)
可重載方法RunProcReturn的完整代碼如下: - #region 執(zhí)行參數(shù)命令文本(有返回值)
- /// <summary>
- /// 執(zhí)行查詢命令文本,并且返回DataSet數(shù)據(jù)集
- /// </summary>
- /// <param name="procName">命令文本</param>
- /// <param name="prams">參數(shù)對象</param>
- /// <param name="tbName">數(shù)據(jù)表名稱</param>
- /// <returns></returns>
- public DataSet RunProcReturn(string procName,
SqlParameter[] prams,string tbName) - {
- SqlDataAdapter dap=CreateDataAdaper(procName, prams);
- DataSet ds = new DataSet();
- dap.Fill(ds,tbName);
- this.Close();
- //得到執(zhí)行成功返回值
- return ds;
- }
- /// <summary>
- /// 執(zhí)行命令文本,并且返回DataSet數(shù)據(jù)集
- /// </summary>
- /// <param name="procName">命令文本</param>
- /// <param name="tbName">數(shù)據(jù)表名稱</param>
- /// <returns>DataSet</returns>
- public DataSet RunProcReturn(string procName, string tbName)
- {
- SqlDataAdapter dap = CreateDataAdaper(procName, null);
- DataSet ds = new DataSet();
- dap.Fill(ds, tbName);
- this.Close();
- //得到執(zhí)行成功返回值
- return ds;
- }
- #endregion
CreateDataAdaper方法可以將帶參數(shù)SqlParameter的命令文本添加到SqlDataAdapter中,并執(zhí)行命令文本。
CreateDataAdaper方法的完整代碼如下: - #region 將命令文本添加到SqlDataAdapter
- /// <summary>
- /// 創(chuàng)建一個SqlDataAdapter對象,以此來執(zhí)行命令文本
- /// </summary>
- /// <param name="procName">命令文本</param>
- /// <param name="prams">參數(shù)對象</param>
- /// <returns></returns>
- private SqlDataAdapter CreateDataAdaper
(string procName, SqlParameter[] prams) - {
- this.Open();
- SqlDataAdapter dap = new SqlDataAdapter(procName,con);
- dap.SelectCommand.CommandType =
CommandType.Text; //執(zhí)行類型:命令文本 - if (prams != null)
- {
- foreach (SqlParameter parameter in prams)
- dap.SelectCommand.Parameters.Add(parameter);
- }
- //加入返回參數(shù)
- dap.SelectCommand.Parameters.Add(new
SqlParameter("ReturnValue", SqlDbType.Int, 4, - ParameterDirection.ReturnValue, false, 0, 0,
- string.Empty, DataRowVersion.Default, null));
- return dap;
- }
- #endregion
CreateCommand方法可以將帶參數(shù)SqlParameter的命令文本添加到CreateCommand中,并執(zhí)行命令文本。
CreateCommand方法的完整代碼如下:
- #region 將命令文本添加到SqlCommand
- /// <summary>
- /// 創(chuàng)建一個SqlCommand對象,以此來執(zhí)行命令文本
- /// </summary>
- /// <param name="procName">命令文本</param>
- /// <param name="prams"命令文本所需參數(shù)</param>
- /// <returns>返回SqlCommand對象</returns>
- private SqlCommand CreateCommand(string procName,
SqlParameter[] prams)
- {
- //確認打開連接
- this.Open();
- SqlCommand cmd = new SqlCommand(procName, con);
- cmd.CommandType = CommandType.Text;//執(zhí)行類型:命令文本
- //依次把參數(shù)傳入命令文本
- if (prams != null)
- {
- foreach (SqlParameter parameter in prams)
- cmd.Parameters.Add(parameter);
- }
- //加入返回參數(shù)
- cmd.Parameters.Add(
- new SqlParameter("ReturnValue", SqlDbType.Int, 4,
- ParameterDirection.ReturnValue, false, 0, 0,
- string.Empty, DataRowVersion.Default, null));
- return cmd;
- }
- #endregion
版塊管理功能模塊類
版塊管理功能模塊類主要用于處理社區(qū)網(wǎng)中有關(guān)版塊的業(yè)務(wù)邏輯功能。由于篇幅有限,其他功能模塊類的源代碼可參見本書附帶光盤。
版塊管理功能模塊類主要用于實現(xiàn)版塊信息的添加、修改、刪除以及各種查詢方式。以下方法提供給陳述層調(diào)用,從編碼的角度出發(fā),這些方法的實現(xiàn)是建立在數(shù)據(jù)層(數(shù)據(jù)庫操作類DataBase.cs)的基礎(chǔ)上的,下面將詳細介紹。
在版塊管理功能模塊類中,首先定義版塊信息的數(shù)據(jù)結(jié)構(gòu),代碼如下: - #region 定義版塊--數(shù)據(jù)結(jié)構(gòu)
- private string moduleid = "";
- private string modulename = "";
- /// <summary>
- /// 版塊編號
- /// </summary>
- public string ModuleID
- {
- get { return moduleid; }
- set { moduleid = value; }
- }
- /// <summary>
- /// 版塊名稱
- /// </summary>
- public string ModuleName
- {
- get { return modulename; }
- set { modulename = value; }
- }
- #endregion
GetMID方法主要用于實現(xiàn)自動生成版塊編號功能,代碼如下: - #region 自動生成版塊編號
- /// <summary>
- /// 自動生成版塊編號
- /// </summary>
- /// <returns></returns>
- public string GetMID()
- {
- DataSet ds = GetAllModule("tb_Module");
- string strCID = "";
- if (ds.Tables[0].Rows.Count == 0)
- strCID = "M1001";
- else
- strCID = "M" + (Convert.ToInt32(ds.
Tables[0].Rows[ds.Tables[0].Rows.Count - 1][0]. ToString().Substring(1, 4)) + 1); - return strCID;
- }
- #endregion
AddModule方法主要用于實現(xiàn)添加版塊信息功能,關(guān)鍵技術(shù)為:創(chuàng)建SqlParameter參數(shù)數(shù)組,通過數(shù)據(jù)庫操作類(DataBase.cs)中MakeInParam方法將參數(shù)值轉(zhuǎn)換為SqlParameter類型,儲存在數(shù)組中,最后調(diào)用數(shù)據(jù)庫操作類(DataBase.cs)中的RunProc方法執(zhí)行命令文本。代碼如下: - #region 添加--版塊信息
- /// <summary>
- /// 添加--版塊信息
- /// </summary>
- /// <param name="modulemanage"></param>
- /// <returns></returns>
- public int AddModule(ModuleManage modulemanage)
- {
- SqlParameter[] prams = {
- ata.MakeInParam("@moduleid", SqlDbType.NVarChar,
50, modulemanage.ModuleID), - data.MakeInParam("@modulename",
SqlDbType.NVarChar, 100, modulemanage.ModuleName), - ;
- return (data.RunProc("INSERT INTO tb_Module
(版塊編號,版塊名稱) VALUES (@moduleid,@modulename)", prams)); - }
- #endregion
UpdateModule方法主要用于實現(xiàn)修改版塊信息功能,代碼如下: - #region 修改--版塊信息
- /// <summary>
- /// 修改--版塊信息
- /// </summary>
- /// <param name="modulemanage"></param>
- /// <returns></returns>
- public int UpdateModule(ModuleManage modulemanage)
- {
- SqlParameter[] prams = {
- ata.MakeInParam("@moduleid", SqlDbType.NVarChar,
50, modulemanage.ModuleID), - data.MakeInParam("@modulename",
SqlDbType.NVarChar, 100, modulemanage.ModuleName), - ;
- return (data.RunProc("update tb_Module set
版塊名稱=@modulename where 版塊編號=@moduleid", prams)); - }
- #endregion
DeleteModule方法主要用于實現(xiàn)根據(jù)版塊編號刪除版塊信息功能,代碼如下: - #region 刪除--版塊信息
- /// <summary>
- /// 刪除--版塊信息
- /// </summary>
- /// <param name="modulemanage"></param>
- /// <returns></returns>
- public int DeleteModule(ModuleManage modulemanage)
- {
- SqlParameter[] prams = {
- data.MakeInParam("@moduleid", SqlDbType.NVarChar,
50, modulemanage.ModuleID), - };
- return (data.RunProc("delete from tb_Module
where 版塊編號=@moduleid", prams)); - }
- #endregion
FindModuleByID、FindModuleByName和GetAllModule方法分別用來實現(xiàn)根據(jù)"版塊編號"、"版塊名稱"得到所有版塊信息功能,代碼如下: - #region 查詢--版塊信息
- /// <summary>
- /// 根據(jù)--版塊編號--得到版塊信息
- /// </summary>
- /// <param name="modulemanage"></param>
- /// <param name="tbName"></param>
- /// <returns></returns>
- public DataSet FindModuleByID(ModuleManage modulemanage, string tbName)
- {
- SqlParameter[] prams = {
- data.MakeInParam("@moduleid", SqlDbType.NVarChar,
50, modulemanage.ModuleID+"%"), - };
- return (data.RunProcReturn("select * from
tb_Module where 版塊編號 like @moduleid", prams, tbName)); - }
- /// <summary>
- /// 根據(jù)--版塊名稱--得到版塊信息
- /// </summary>
- /// <param name="modulemanage"></param>
- /// <param name="tbName"></param>
- /// <returns></returns>
- public DataSet FindModuleByName(ModuleManage
modulemanage, string tbName) - {
- SqlParameter[] prams = {
- ata.MakeInParam("@modulename", SqlDbType.NVarChar,
100, modulemanage.ModuleName+"%"), - };
- return (data.RunProcReturn("select * from
tb_Module where 版塊名稱 like @modulename", prams, tbName)); - }
- /// <summary>
- /// 得到所有--版塊信息
- /// </summary>
- /// <param name="tbName"></param>
- /// <returns></returns>
- public DataSet GetAllModule(string tbName)
- {
- return (data.RunProcReturn("select *
from tb_Module ORDER BY 版塊編號", tbName)); - }
- #endregion
|