今天講解的是之前幫別人做的一個(gè)小程序,負(fù)責(zé)實(shí)現(xiàn)其中最重要的模塊,提取數(shù)據(jù),并畫圖。很多初學(xué)的朋友都希望以一個(gè)實(shí)際的項(xiàng)目來學(xué)習(xí),我也是初學(xué)者,所以其中可能有許多不正規(guī)的地方,請(qǐng)高手指正。下面就以一個(gè)具體的項(xiàng)目來實(shí)現(xiàn)。
項(xiàng)目名稱:基于WEB的統(tǒng)計(jì)過程控制系統(tǒng)
項(xiàng)目目的:使用ASP.NET統(tǒng)計(jì)數(shù)據(jù)并用圖標(biāo)的形式表現(xiàn)出來
項(xiàng)目實(shí)現(xiàn):vs2010+MSSQL2008+MSChart
項(xiàng)目數(shù)據(jù):Excel數(shù)據(jù),需要能夠?qū)隕xcel數(shù)據(jù),并將Excel中的數(shù)據(jù)做處理并將處理結(jié)果以圖標(biāo)形式表現(xiàn)出來。Excel附下載地址。
其中mssql2008不需要獨(dú)立安裝,在裝vs2010的時(shí)候默認(rèn)就裝了一個(gè)Express版本的SQLServer,我們只需要裝上ManagementStudio即可,可以去官方下載。
技術(shù)準(zhǔn)備:
因?yàn)樵趯?shí)際項(xiàng)目中,公司為了方便代碼管理和代碼重用,經(jīng)常使用三層架構(gòu)開發(fā)程序。這里我們也采用三層架構(gòu),這里會(huì)用到SqlHelper這個(gè)類來方便我們的數(shù)據(jù)操作。這里稍微介紹下ASP.NET的三層架構(gòu),數(shù)據(jù)持久層---業(yè)務(wù)邏輯層----UI表現(xiàn)層,這是一般的三層架構(gòu),在這里大家要注意三層架構(gòu)不是MVC模式,這兩者還是有一點(diǎn)區(qū)別的,大家要注意下。
ASP.NET中的數(shù)據(jù)持久層和業(yè)務(wù)邏輯層一般為,而表現(xiàn)層一般就是website了,通常還有一個(gè)對(duì)象層。一般命名為BLL,DAL,Web。關(guān)于詳細(xì)的解釋大家可以去網(wǎng)上找資料,這里不是本系列的重點(diǎn)。附件有一個(gè)三層架構(gòu)的Demo,有興趣的話可以下載研究研究,呵呵。
在創(chuàng)建三層架構(gòu)的時(shí)候,很多人都不知道怎么用解決方案將website和類庫項(xiàng)目關(guān)聯(lián)起來,下面來分享下我的方法,
1. 首先創(chuàng)建一個(gè)空白的解決方案項(xiàng)目,在名稱中輸入Bolt,路徑為E:\WorkSpace\projects,則會(huì)在當(dāng)前路徑下生成一個(gè)Blot文件夾,里面有一個(gè)Bolt.sln文件
2. 然后添加website,或者是類庫項(xiàng)目,這里我們先創(chuàng)建website,右擊解決方案或者選擇File》New,新建一個(gè)website,在weblocation中輸入E:\WorkSpace\projects\Bolt\WebSite
WebSite即網(wǎng)站的名字,添加完成后,會(huì)發(fā)現(xiàn)Blot又多了個(gè)文件夾,即網(wǎng)站所在路徑
3. 然后在添加新項(xiàng)目,選擇類庫項(xiàng)目,Name命名為BLL,路徑為:E:\WorkSpace\projects\Bolt,
點(diǎn)擊確定后,Blot文件下又多了文件夾,即類庫所在路徑,類似的可以添加其他項(xiàng)目。
4. 這樣我們就可以直接雙擊Bolt.sln打開多個(gè)項(xiàng)目或者是網(wǎng)站了
按照上述方法添加DAL,Model。把項(xiàng)目的整體架構(gòu)先搭建起來,就像蓋房子,先把地基打好。
其實(shí)在打地基之前,我們更應(yīng)該先了解客戶需要什么樣的房子。
簡單的需求分析:
1. 用戶模塊(登錄、用戶管理),比較容易實(shí)現(xiàn),如果需要ajax登錄可以參考我前面的博文(Ajax登錄頁面)
2. 導(dǎo)入數(shù)據(jù)模塊(數(shù)據(jù)導(dǎo)入從Excel導(dǎo)入數(shù)據(jù)到boltdata表)
3. 數(shù)據(jù)模塊(可以對(duì)boltdata表增、刪、改、查, 給一個(gè)全部刪除的按鈕)
4. 圖標(biāo)模塊(統(tǒng)計(jì),用日期柱狀圖和曲線圖來統(tǒng)計(jì)每天的數(shù)量)
我們一步步來實(shí)現(xiàn)這幾個(gè)需求。
一、登錄模塊
這是幾乎所有信息類型的網(wǎng)站必備的模塊,之前也寫過用ajax登錄。這邊沒有這個(gè)需求,就用簡單的方法實(shí)現(xiàn)。
首先建立數(shù)據(jù)表,表結(jié)構(gòu)如下:
CREATE TABLE [dbo].[Login](
[id] [int] IDENTITY(1,1) NOT NULL,
[username] [varchar](20) NULL,
[userpassword] [varchar](20) NULL
)
id為標(biāo)志,username為用戶名,userpassword為用戶密碼。
然后打造Model層:
新建IDBHelper.cs接口,代碼如下:
using System;
using System.Data.Common;
using System.Data;
namespace SqlServerDAL
{
interface IDBHelper
{
/// <summary>
/// 執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
/// </summary>
int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。
/// </summary>
int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行查詢,返回DataSet
/// </summary>
DataSet ExecuteQuery(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 執(zhí)行查詢,返回DataSet
/// </summary>
DataSet ExecuteQuery(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行查詢,返回DataReader
/// </summary>
DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 執(zhí)行查詢,返回DataReader
/// </summary>
DbDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略其他列或行。
/// </summary>
object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略其他列或行。
/// </summary>
object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 分頁獲取數(shù)據(jù)
/// </summary>
/// <param name="connectionString">連接字符串</param>
/// <param name="tblName">表名</param>
/// <param name="fldName">字段名</param>
/// <param name="pageSize">頁大小</param>
/// <param name="pageIndex">第幾頁</param>
/// <param name="fldSort">排序字段</param>
/// <param name="fldDir">升序{False}/降序(True)</param>
/// <param name="condition">條件(不需要where)</param>
DbDataReader GetPageList(string connectionString, string tblName, int pageSize, int pageIndex, string fldSort, bool fldDir, string condition);
/// <summary>
/// 得到數(shù)據(jù)條數(shù)
/// </summary>
/// <param name="tblName">表名</param>
/// <param name="condition">條件(不需要where)</param>
/// <returns>數(shù)據(jù)條數(shù)</returns>
int GetCount(string connectionString, string tblName, string condition);
}
}
然后實(shí)現(xiàn)這個(gè)接口:類DBHelper,代碼見附件
其中類的構(gòu)造函數(shù)中指定使用的數(shù)據(jù)庫服務(wù)器名及用戶名和密碼。
當(dāng)然,也要提供 SqlHelper.cs類,附下載地址
接下來就是實(shí)現(xiàn)BLL,業(yè)務(wù)邏輯層的Login,代碼如下:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Web;
namespace BLL
{
/// <summary>
/// 業(yè)務(wù)邏輯類 Login
/// </summary>
public class Login
{
private readonly SqlServerDAL.Login dal = new SqlServerDAL.Login();
public Login()
{ }
/// <summary>
/// 增加一條數(shù)據(jù)
/// </summary>
public void Add(Model.Login model)
{
dal.Add(model);
}
/// <summary>
/// 更新一條數(shù)據(jù)
/// </summary>
public void Update(Model.Login model)
{
dal.Update(model);
}
/// <summary>
/// 刪除一條數(shù)據(jù)
/// </summary>
public void Delete(int id)
{
dal.Delete(id);
}
/// <summary>
/// 是否存在該記錄
/// </summary>
public bool Exists(string username)
{
return dal.Exists(username);
}
/// <summary>
/// 得到一個(gè)對(duì)象實(shí)體
/// </summary>
public Model.Login GetModel(string username)
{
return dal.GetModel(username);
}
/// <summary>
/// 獲得泛型數(shù)據(jù)列表
/// </summary>
public List<Model.Login> GetList(out long count)
{
return dal.GetList(out count);
}
}
}下面就該實(shí)現(xiàn)website里面的登錄模塊了。
這里使用Cookie來存儲(chǔ)用戶信息,
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;
/// <summary>
/// UserCookies 的摘要說明
/// </summary>
public class UserCookies
{
public const string cksUserName = "COOKIES_1_1";
public UserCookies()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}
public void SetCookies(string name, string Value)
{
System.Web.HttpContext.Current.Response.Cookies.Add(new System.Web.HttpCookie(name, Value));
}
public void SetCookies(Model.Login user)
{
SetCookies(cksUserName, user.username);
}
public string GetCookies(string name)
{
if (System.Web.HttpContext.Current.Request.Cookies[name] == null)
return "";
if (System.Web.HttpContext.Current.Request.Cookies[name].Value == null || System.Web.HttpContext.Current.Request.Cookies[name].Value == "")
return "";
return System.Web.HttpContext.Current.Request.Cookies[name].Value;
}
public void ClearUserCookies()
{
SetCookies(cksUserName, "");
}
}