今天講解的是之前幫別人做的一個(gè)小程序,負(fù)責(zé)實(shí)現(xiàn)其中最重要的模塊,提取數(shù)據(jù),并畫(huà)圖。很多初學(xué)的朋友都希望以一個(gè)實(shí)際的項(xiàng)目來(lái)學(xué)習(xí),我也是初學(xué)者,所以其中可能有許多不正規(guī)的地方,請(qǐng)高手指正。下面就以一個(gè)具體的項(xiàng)目來(lái)實(shí)現(xiàn)。
項(xiàng)目名稱(chēng):基于WEB的統(tǒng)計(jì)過(guò)程控制系統(tǒng)
項(xiàng)目目的:使用ASP.NET統(tǒng)計(jì)數(shù)據(jù)并用圖標(biāo)的形式表現(xiàn)出來(lái)
項(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)出來(lái)。Excel附下載地址。
其中mssql2008不需要獨(dú)立安裝,在裝vs2010的時(shí)候默認(rèn)就裝了一個(gè)Express版本的SQLServer,我們只需要裝上ManagementStudio即可,可以去官方下載。
技術(shù)準(zhǔn)備:
因?yàn)樵趯?shí)際項(xiàng)目中,公司為了方便代碼管理和代碼重用,經(jīng)常使用三層架構(gòu)開(kāi)發(fā)程序。這里我們也采用三層架構(gòu),這里會(huì)用到SqlHelper這個(gè)類(lèi)來(lái)方便我們的數(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,有興趣的話(huà)可以下載研究研究,呵呵。
在創(chuàng)建三層架構(gòu)的時(shí)候,很多人都不知道怎么用解決方案將website和類(lèi)庫(kù)項(xiàng)目關(guān)聯(lián)起來(lái),下面來(lái)分享下我的方法,
1. 首先創(chuàng)建一個(gè)空白的解決方案項(xiàng)目,在名稱(chēng)中輸入Bolt,路徑為E:\WorkSpace\projects,則會(huì)在當(dāng)前路徑下生成一個(gè)Blot文件夾,里面有一個(gè)Bolt.sln文件
2. 然后添加website,或者是類(lèi)庫(kù)項(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)目,選擇類(lèi)庫(kù)項(xiàng)目,Name命名為BLL,路徑為:E:\WorkSpace\projects\Bolt,
點(diǎn)擊確定后,Blot文件下又多了文件夾,即類(lèi)庫(kù)所在路徑,類(lèi)似的可以添加其他項(xiàng)目。
4. 這樣我們就可以直接雙擊Bolt.sln打開(kāi)多個(gè)項(xiàng)目或者是網(wǎng)站了
按照上述方法添加DAL,Model。把項(xiàng)目的整體架構(gòu)先搭建起來(lái),就像蓋房子,先把地基打好。
其實(shí)在打地基之前,我們更應(yīng)該先了解客戶(hù)需要什么樣的房子。
簡(jiǎn)單的需求分析:
1. 用戶(hù)模塊(登錄、用戶(hù)管理),比較容易實(shí)現(xiàn),如果需要ajax登錄可以參考我前面的博文(Ajax登錄頁(yè)面)
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ì),用日期柱狀圖和曲線(xiàn)圖來(lái)統(tǒng)計(jì)每天的數(shù)量)
我們一步步來(lái)實(shí)現(xiàn)這幾個(gè)需求。
一、登錄模塊
這是幾乎所有信息類(lèi)型的網(wǎng)站必備的模塊,之前也寫(xiě)過(guò)用ajax登錄。這邊沒(méi)有這個(gè)需求,就用簡(jiǎn)單的方法實(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為用戶(hù)名,userpassword為用戶(hù)密碼。
然后打造Model層:
新建IDBHelper.cs接口,代碼如下:
using System;
using System.Data.Common;
using System.Data;
namespace SqlServerDAL
{
interface IDBHelper
{
/// <summary>
/// 執(zhí)行 Transact-SQL 語(yǔ)句并返回受影響的行數(shù)。
/// </summary>
int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行 Transact-SQL 語(yǔ)句并返回受影響的行數(shù)。
/// </summary>
int ExecuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行查詢(xún),返回DataSet
/// </summary>
DataSet ExecuteQuery(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 執(zhí)行查詢(xún),返回DataSet
/// </summary>
DataSet ExecuteQuery(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行查詢(xún),返回DataReader
/// </summary>
DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 執(zhí)行查詢(xún),返回DataReader
/// </summary>
DbDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 在事務(wù)中執(zhí)行查詢(xún),并返回查詢(xún)所返回的結(jié)果集中第一行的第一列。忽略其他列或行。
/// </summary>
object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 執(zhí)行查詢(xún),并返回查詢(xún)所返回的結(jié)果集中第一行的第一列。忽略其他列或行。
/// </summary>
object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
/// <summary>
/// 分頁(yè)獲取數(shù)據(jù)
/// </summary>
/// <param name="connectionString">連接字符串</param>
/// <param name="tblName">表名</param>
/// <param name="fldName">字段名</param>
/// <param name="pageSize">頁(yè)大小</param>
/// <param name="pageIndex">第幾頁(yè)</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è)接口:類(lèi)DBHelper,代碼見(jiàn)附件
其中類(lèi)的構(gòu)造函數(shù)中指定使用的數(shù)據(jù)庫(kù)服務(wù)器名及用戶(hù)名和密碼。
當(dāng)然,也要提供 SqlHelper.cs類(lèi),附下載地址
接下來(lái)就是實(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ù)邏輯類(lèi) 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來(lái)存儲(chǔ)用戶(hù)信息,
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 的摘要說(shuō)明
/// </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, "");
}
}