在软卓班的第一个小系统.其实在软卓跟其他软件班一样嘛,哎照样上课,我又没参与到老师的项目....
当真是从0开始啊,在项目开始的时候才发现,原来自己的.net的知识真的是0,,,囧..自己花在这一方面的时间太少了..哎..一开始就准备各种资料,首先就是三层架构...orz,,最基础的东西我花了一天时间去看网上的各种资料,,最后竟然在自己的Asp.net的书最后一个项目看到有这一方面较系统的知识..真是想吐血了.网上的资料也许比较直接,但是就是不够系统..然后是代码了,三层架构理解了小部分,代码基本上可以动了.但是我勒个去,,叫自己小组的人画数据库,,但是光顾着LOL就是不会和我们这边的人交流,,搞的写出来的数据库真是那个不敢恭维,,真是够"简朴的"!!!所以小组的WM同学又得重建数据库..虽然也 简朴但是能用就行了,我的要求并不高-_-...代码开始写了,,从底层开始写了
一开始就是数据访问层部分(DAL,IDAL),一开始还不会用微软带的helper类,,囧..所以写的连接数据库的部分真是又长又臭,就是建立一个连接字符串,然后建立sqlserver语句来当做命令对象..用helper类好简单啊,一开始我的代码就是这样:
#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加油!!!