在軟卓班的第一個小系統.其實在軟卓跟其他軟體班一樣嘛,哎照樣上課,我又沒參與到老師的項目....
當真是從0開始啊,在項目開始的時候才發現,原來自己的.net的知識真的是0,,,囧..自己花在這一方面的時間太少了..哎..一開始就準備各種資料,首先就是三層架構...orz,,最基礎的東西我花了一天時間去看網上的各種資料,,最後竟然在自己的Asp.net的書最後一個項目看到有這一方面較系統的知識..真是想吐血了.網上的資料也許比較直接,但是就是不夠系統..然後是代碼了,三層架構理解了小部分,代碼基本上可以動了.但是我勒個去,,叫自己小組的人畫資料庫,,但是光顧著LOL就是不會和我們這邊的人交流,,搞的寫出來的資料庫真是那個不敢恭維,,真是夠"簡樸的"!!!所以小組的WM同學又得重建資料庫..雖然也
簡樸但是能用就行了,我的要求並不高-_-...代碼開始寫了,,從底層開始寫了
一開始就是資料訪問層部分(DAL,IDAL),一開始還不會用微軟帶的helper類,,囧..所以寫的串連資料庫的部分真是又長又臭,就是建立一個連接字串,然後建立sqlserver語句來當做命令對象..用helper類好簡單啊,一開始My Code就是這樣:
#region 得到發行所有新聞 public static DataSet GetUserNewsListByUserID(string userID) { string connectionString = ConfigurationManager.ConnectionStrings["PubsConnectionString"].ToString(); //ConfigurationManage using (SqlConnection dbConnection = new SqlConnection(connectionString)) { dbConnection.Open(); string queryString = "Select _title,_content,_userName from dbo.News where _userID=@userID order by _date DESC"; SqlCommand dbCommand = new SqlCommand(); dbCommand.Connection = dbConnection; dbCommand.CommandType = CommandType.Text; dbCommand.CommandText = queryString; //userID參數 SqlParameter dbParameter_userID = new SqlParameter(); dbParameter_userID.ParameterName = "@userID"; dbParameter_userID.Value = userID; dbParameter_userID.DbType = DbType.StringFixedLength; dbCommand.Parameters.Add(dbParameter_userID); //運行sqlserver命令 SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCommand); DataSet ds = new DataSet(); dataAdapter.Fill(ds); return ds; } } #endregion
但是何必呢?這樣太麻煩了..
後來回頭翻老師的課件,,囧..於是看到了sqlhelper類的用法..
/// <summary> /// 根據使用者ID,得到使用者發行的新聞列表 /// </summary> /// <param name="userID">使用者ID</param> /// <returns>使用者發行的新聞列表</returns> public List<NewsModel> GetUserNewsListByUserName(string userName)//傳回型別很重要,這樣子就可以用對象的思想了 { //建立新聞對象列表 List<NewsModel> userNewsList = new List<NewsModel>(); //選擇dbo.Table_News中該使用者發行新聞的標題、作者、發布日期 string sql = "select top 10 NewsID, Title,UserName,Date from dbo.Table_News where UserName=@userName order by Date desc"; SqlParameter[] param = new SqlParameter[1]{ // new SqlParameter("@userName","@password", userName,password) //必須的注意了:這個@UserName是資料庫的欄位,而上面的@userName是中間變數 new SqlParameter("@UserName", userName) }; SqlDataReader res = sqlhelper.ExecuteReader(sql, CommandType.Text, param); //擷取新聞對象 while (res.Read()) { //建立新聞對象 NewsModel news = new NewsModel(); //給新聞對象屬性賦值 //使用SqlDataReader的GetOrdinal()方法,獲得列的序號,輸入參數為列名 //從reader中拿出相對應的列並且賦值於model身上.那就OK了,呵呵 news.NewsID = res.GetInt32(res.GetOrdinal("NewsID")); news.Title = res.GetString(res.GetOrdinal("Title")); news.UserName = res.GetString(res.GetOrdinal("UserName")); news.Date = res.GetDateTime(res.GetOrdinal("Date")); //將新聞添加到列表中 userNewsList.Add(news); } return userNewsList; }
一開始我還沒有把參數載入到sqlparameter當中的,囧.現在還只是知道怎麼用,具體運行機制還不是很清楚.囧.
這是一個關鍵的代碼之處.也是我碰到的一個小坎.
接下來嘛就是書寫商務邏輯層BLL的代碼了,呵呵,如果DLL的代碼寫好了,我一開始用的是DataSet這樣的傳回型別(這樣高深的做法),但是回頭在一個部落格裡面見到,用泛型list是現在最流行的啊.DataSet的是以前的寫法..呃,,我這小菜鳥,還沒怎麼認識.不過因為c++,所以對list 還算熟,那麼就用泛型吧.後來知道gridview竟然一般是可以接收list的類型文章的,好不管了.想到這裡整個項目基本上就成功了,能連上gridview可能對大牛;來說就是切菜,但是對於我這個0開始的小菜,竟然摸索了那麼久,真心慚愧.
寫到這,還是回頭講一下自己的三層架構吧,畢竟自己辛辛苦苦的搜了一天,榨出來的小結就只有短短几句話:資料訪問層嘛就是主要是從資料庫中取資料,存資料.關鍵的資料庫存取碼就是在這裡寫了.然後商務邏輯層嘛:就是負責把客戶要求的商務邏輯在表達出來的情況下去訪問資料庫:說的太抽象了,囧..自我認為就是:從資料庫取出來的資料,如果還需要具有一定的邏輯性的話,應該算是傳進去的參數就有這個神奇的功能,因為對於資料庫來說,誰來取資料他不知道.只有商務邏輯層知道,至於顯示層嘛,使用者在這裡視圖上點擊能夠顯示出來的業務效果在顯示層的設計代碼出現了,對於這我也有點疑惑是佔了商務邏輯層的工作.但是在網上有反駁的話沒看懂.
除了IDLL,DLL,IBLL,IBLL.還有建立了工廠.建立工廠的效果是
namespace NewsPublish.Factory{ public static class DALFactory { public static IUserDAL CreateUserDAL() { return new UserDAL(); } public static INewsDAL CreateNewsDAL() { return new NewsDAL(); } }}
比如在BLL層就要通過DAL比如在BLL層就要通過DAL工廠來建立DAL的執行個體,如此便可在BLL層調用DAL層的資料了:
下面這句話就是這個作用:
namespace NewsPublish.BLL
{
public class NewsBLL : INewsBLL
{
INewsDAL _newsDAL = Factory.DALFactory.CreateNewsDAL();//開始BLL之前建立了DAL對象便於引用DAL的方法
建立工廠的好處是直接有一個對象會自動被產生就可以了,我們不必管它是怎麼產生的.
下面的BLL層的工廠,在顯示層的設計代碼中會被引用產生對象.
namespace NewsPublish.Factory{ public class BLLFactory { public static IUserBLL CreatUserBLL() { return new UserBLL(); } public static INewsBLL CreateNewsBLL() { return new NewsBLL(); } }}
說了這些,感覺關鍵代碼都說得差不多了..但是顯示層gridview我卻還沒搞定.哎,老師上課示範走神,這是對我的懲罰延遲到了作為那一天(父類)的這一天(子類)..
顯示層算是請了班上熟練的好手來幫忙了:
首先看看這個gridview吧:
普通的一個gridview:
然後看看前台gridview的屬性以及後台gridview的代碼:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Height="599px" Width="800px" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"> <Columns> <asp:HyperLinkField DataNavigateUrlFields="NewsID" DataNavigateUrlFormatString="~/newscontent.aspx ? NewsID={0}" DataTextField="Title" HeaderText="標題" NavigateUrl="~/newscontent.aspx"/> <asp:BoundField HeaderText="作者" DataField="UserName" /> <asp:BoundField HeaderText="發布時間" DataField="Date" /> <asp:BoundField DataField="NewsID" HeaderText="NewsID" Visible="False" /> </Columns> </asp:GridView>
首先是第一列,列名是標題,然後資料繫結是資料庫中 "Title"!!這是個超連結,然後需要傳參數進去,所以就需要?NewsID,並且註明跳轉到某一特定頁面.
然後第二列是直接寫在DIV上面的(不是很清楚,猜的),列名是作者,繫結資料在資料庫中是 "Date",以此類推.
再看看後台代碼是怎麼串連gridview和BLL層的.
public partial class WebForm2 : System.Web.UI.Page { INewsBLL _iBLL; protected void Page_Load(object sender, EventArgs e) { { _iBLL = BLLFactory.CreateNewsBLL();//通過BLL介面建立一個BLL對象執行個體 GridView1.DataSource = _iBLL.GetAllNewsList();//綁定資料來源,BLL層函數傳回型別是List的. GridView1.DataBind();//調用綁定,也就是已進入這個頁面的資料就會綁定好,並且出現 } } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { } }
說到這也差不多了,最後剩下一項就是頁面跳轉吧,在調試的時候出現了問題,一開始使用:
那麼最後一項就講一下頁面跳轉吧:
也就是有上面這一個發布新聞頁面跳轉到下面發行新聞列表這個頁面:
下面看看跳轉的後台代碼:
protected void Button1_Click(object sender, EventArgs e) { string title = Txt_Title.Text.ToString(); string publisher = Txt_Publish.Text.ToString(); if (true)//判斷如果發布人不是使用者名稱,則不能發布,此功能暫沒實現 { } string content = Txt_Content.Text.ToString(); DateTime date = DateTime.Now; bool tmp = _newsBLL.PublishNews(title, date, publisher, content); //暫時假定發布一定成功,所以利馬跳轉到發行新聞頁面 Session["userName"] = publisher; Response.Redirect("personnel.aspx"); }
一開始直接在Response加了?和參數的這種類型,調試過不去,同學LX後來改用Session這種方法就可以了,囧.
好,下面看接受方的後台代碼:
public partial class personnel : System.Web.UI.Page { INewsBLL _newsBLL = NewsPublish.Factory.BLLFactory.CreateNewsBLL(); protected void Page_Load(object sender, EventArgs e) { // string userName = Request.QueryString["userName"].ToString(); string userName = Session["userName"].ToString(); GridView1.DataSource = _newsBLL.GetUserNewsListByUserName(userName); GridView1.DataBind(); } protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { string userName = Request.QueryString["userName"].ToString(); //DataTable dt=new DataTable(); //dt=_newsBLL.GetUserNewsListByUserID(userName); GridView1.DataSource = _newsBLL.GetUserNewsListByUserName(userName); GridView1.DataBind(); } }
搞不清楚一開始的Response+Request竟然調試不過去群毆就暈了..這裡的綁定跟上面的雷同..
整個項目的代碼差不多就是這樣了.但可惡的老師說這隻是第一階段的需求;
還有第二階段,第三階段在後面等著呢?哎,我的Acm時間,我的考研時間,orz...但還是必須後續,,
因為雖然能花的時間不多,但是就是不能讓別人小看了....
加油,加油,muxi加油!!!