用C#做网站,感觉该编程语言对数据方面很仔细的设计,
暂时感受的C#特点:
整个网站工程被分为三层:
数据底层
数据中间层(中介性质的)
业务表达层
数据底层:
连接数据库的文件,公司已经有现成的编译完成文件
类似ASP里面CONN文件的作用
数据中间层:
对数据表的具体定义范围。
类似ASP中对需要进行数据操作的文件开头加的那段话
业务表达层:
网站的页面、网站的各种目录结构与其相关图片等多媒体素材。这里有个很重要的开发经验:将各种部件设计成控件,安放到网站里面,包括以前我习惯的TOP.ASP LEFT.ASP。当然咯,能被设计成控件的不只这些,甚至可以将控件组成一个网站。
一些C#的概念:
网页命名为:.aspx
网页自编控件命名为:ascx
将ascx放入aspx后就是一个整体页面了
当然咯,一个整体页面的背后都有一个代码层,(好比VB的一个界面后面有一个程序编写窗口)
页面代码层不是HTML,而是纯C#语言,HTML则放在整体页面层。
页面代码层命名为:.aspx.cs
在C#开发软件里,是无法在文件列表里看到CS页面的,可以通过控件双击(和VB一样)或点击“查看代码”按扭。查看到当前网站页面的页面代码层。
实际上页面代码层是很主要的,以下简称CS
关于现在接触的C#命令:
Using System;
Using System.Data;
Using System.Drawing;
Using System.Web;
Using System.Web.UI.WebControls;
Using System.Web.UI.HtmlControls;
Using prjSystem;
Using prjFactory;
以上USING后面跟的是类库
当USING它们了以后,在后面的编程中可以忽略这些类库,而直接写后面的命令或参数,
比如:Public DataTable dt;
实际上,这句话是这样的: Public System.Data. DataTable dt
现在省略为:Public DataTable dt;
这样的话,按照个人想法,在初学过程中,由于不知道那些应该被USING那些不需要被USING。全部都USING上,不是一件坏事
读取数据库:
以一个简单的示例列举相关命令来解读本软件如何实现从数据库内读取信息的
使用:
<%#DataBinder.Eval(Container, ”DataItem.Charaters”)%>命令,其中Charaters是数据库字段
我们在页面中按照自己的方式建立表格,设计出基本筐架,然后将数据库读取命令添入其中,(这与ASP的<%=rs(“字段”)%>相同原理)。
在该页面的CS中
首先需要定义库类(USING一堆)
其次是以下这些东西
其用途好像是将网页中所用到的控件都定义一遍,估计应该是连接,而不是定义
第一句是自动生成的
Public class new_list: System.Web.UI.UserControl
{
Protected string ownerPLB;
Public DataTable dt;
Protected System.Web.UI.WebControls.DataList grd;
Protected System.Web.UI.WebControls.Label lblDoc;
接下来就是这个,当页面被加载的时候所执行的命令。
If里面是判断了用户浏览器是否可以正确加载网页
BindDate();和VB里面的子程序一样意思
Private void Page_Load (object sender, System.EventArgs e)
{
If (! this.IsPostBack)
{
BindDate ();
}
}
接下来是如下代码:
类似一个子程序的代码,被加载到上面的代码里
Private void BindDate ()
{
News emp = new News ();
Qualifier qlf = new Qualifier ();
dt = emp.queryAsDataTable (new prjSystem.Qualifier ());
grd.DataSource = dt; //将数据源的信息反馈给控件,让其填充出数据
grd.DataBind(); //将控件绑定到数据源
}
这里是很主要的一段,类似核心。
News();所指向的是数据中间层的一个CS文件内的子程序
这里要说明下,可能是一个编程习惯。
将网站所涉及对数据库操作的页面功能,例如(新闻、会员、商品、)这些,无论是读操作还是写操作。都将每个功能单独写个CS文件。而这里的所列举的是一个新闻读取功能,在数据中间层有一个News的CS文件。
News的CS文件重要部分的一部分解释:
Public class News
{
MSXML2.IXMLDOMNode mvarConstruct;
Public News ()
{
MSXML2.DOMDocument30Class objdom= new DOMDocument30Class ();
MvarConstruct=objdom.createElement ("News");
}
//初始化 mvarConstruct 类似格式化磁盘,这样可以对mvarConstruct读写
Public IXMLDOMNode Construct
{
Get {return mvarConstruct ;}
Set {mvarConstruct=value ;}
}
//将以下属性的值返回给mvarConstruct
Public string ID
{
Get {return DomUtil.FindOptionalElement (mvarConstruct, "ID", "").text ;}
Set {DomUtil.FindOptionalElement (mvarConstruct, "ID", "","").text =value ;}
}
//这是一个属性,是News的属性。可以根据需要自己建立属性
数据库读取完成
根据一个字段值查询相关记录(绝对查询)
If (! this.IsPostBack)
{
Try //处理错误。类似VB的IF ON ERROR
{
If (Request.QueryString ["ID"]! = null) //吸收那个ID
Bind(); //对应下面的bind()
}
Catch (Exception ee)
{
Response. Write (ee.ToString ());
}
}
Private void Bind ()
{
PrjFactory.News art = new prjFactory.News ();
PrjSystem.Qualifier qlf = new prjSystem.Qualifier ();
qlf.addNewField ("News","ID","=","'"+Request.QueryString ["ID"] +"'");
If (art.queryAsBool (qlf))
{
this.lblTitle.Text = art.Title;
this.lblTime.Text = art.CreateDate;
this.lblNewsShow.Text = art.Content;
}
}
无条件读取数据库和根据字段值读取数据库的区别:
无条件读取数据库 | 根据字段值读取数据库 |
private void } private void Page_Load(object sender, System.EventArgs e) { if(!this.IsPostBack) { BindDate(); } } | private void Page_Load(object sender, System.EventArgs e) { if(!this.IsPostBack) { try { if(Request.QueryString["ID"] != null) Bind(); } catch(Exception ee) { Response.Write(ee.ToString()); } } |
private void private void BindDate() { prjFactory.News emp = new prjFactory.News(); Qualifier qlf = new Qualifier(); dt = emp.queryAsDataTable(new prjSystem.Qualifier()); grd.DataSource = dt; grd.DataBind(); } | private void Bind() { prjFactory.News art = new prjFactory.News(); prjSystem.Qualifier qlf = new prjSystem.Qualifier(); qlf.addNewField("News","ID","=","'"+Request.QueryString["ID"]+"'"); if(art.queryAsBool(qlf)) { this.lblTitle.Text = art.Title; this.lblTime.Text = art.CreateDate; this.lblNewsShow.Text = art.Content; } } |
数据库写入:
建立的控件(文本框、按钮等)都必须使用工具箱里的WEB窗体内的控件
C#不存在表单提交的概念,只有VB里的双击控件编写代码
规定的一堆命令(类似USING和protected)后的主要命令:
Private void Page_Load (object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
If (! this.IsPostBack)
{
WebWlsteel.PageUtil.fillDate (drpDate); //从库中取出日期
WebWlsteel.PageUtil.fillMonth (drpMonth); //从库中取出月份
WebWlsteel.PageUtil.fillYear (drpYear); //从库中取出年份
//以上的库都在pageuntil的CS文件中
}
ShowZhi (); //又是一个子程序的例子
If (! this.IsPostBack)
{
pageconfig (); //又是一个子程序的例子
}
}
private void pageconfig()
{
WebWlsteel.PageUtil.fillminzu(this.drpminzu);
this.drpmarry.Items.Add(new ListItem("** 请选择 **","0"));
this.drpmarry.Items.Add(new ListItem("未婚","1"));
this.drpmarry.Items.Add(new ListItem("已婚","2"));
WebWlsteel.PageUtil.fillzhicheng(this.drpzhicheng);
}
private void ShowZhi()
{
if(Request.QueryString["ssID"] == null)
{
}
else
{
prjFactory.EmployeeInfo cy = new prjFactory.EmployeeInfo();
if(cy.queryItemByID(Request.QueryString["ssID"]))
{
this.txtzhiwei.Text = cy.Positions;
}
}
在点击确定后使用的代码:
private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
HRrcdj hr = new HRrcdj(); //又是一个初始化的操作
hr.name = this.txtname.Text; //将控件的内的数据写入数据库相应字段
.
.
.
hr.birthday = drpYear.SelectedItem.Value + "-" + drpMonth.SelectedItem.Value + "-" + drpDate.SelectedItem.Value;
if(hr.addNew()) //返回一个写入成功的值
{
Page.RegisterStartupScript("ID","<script>alert('提交成功,我们会尽快与您联系!');window.location.href='#.aspx';</script>");
}
else
{
Page.RegisterStartupScript("ID","<script>alert('保存失败!');</script>");
}
}
至此。用C#做网站的读写数据库结束,感觉比ASP复杂很多很多,同时也感到了将网站设计结合了VB的一些方法,比如双击控件写代码,没有了表单提交。