榴莲的味道

年轻人的Blog,欢迎您!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

三层架构之数据库访问层完全篇(又一说)

Posted on 2006-08-13 21:33  刘建锋  阅读(809)  评论(0)    收藏  举报

如何使用C#创建一个三层的数据库应用程序
1.分析
在我们这个程序中采用如下的层次:Web层,业务实体层,数据层。
其中:
业务实体层负责Web层与数据层之间的数据交换。
数据层仅仅代表数据库。
Web层通过业务实体层来访问数据库。
我们的中间的业务实体层采用WebService.
2.实例
我们通过一个实例来学习三层架构。
(1) 以sql2000为例
建立TestUser数据库。
表的sql脚本(在查询分析器中执行即可):
/****** Object: Table [dbo].[Customers] Script Date: 2004-01-08 0:46:35 ******/
CREATE TABLE [dbo].[Customers] (
[CustomerID] [int] IDENTITY (1, 1) NOT NULL ,
[CustomerName] [char] (20) NOT NULL ,
[addr] [varchar] (50) NULL ,
[city] [char] (20) NULL ,
[phone] [char] (20) NULL ,
[fax] [char] (10) NULL
) ON [PRIMARY]
GO

/****** Object: Table [dbo].[Users] Script Date: 2004-01-08 0:46:36 ******/
CREATE TABLE [dbo].[Users] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[TrueName] [char] (20) NOT NULL ,
[RegName] [char] (20) NOT NULL ,
[Pwd] [char] (10) NOT NULL ,
[Sex] [char] (2) NULL ,
[Email] [char] (20) NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Customers] WITH NOCHECK ADD
CONSTRAINT [PK_Customers] PRIMARY KEY NONCLUSTERED
(
[CustomerID]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Users] WITH NOCHECK ADD
CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED
(
[ID]
) ON [PRIMARY]
GO

(2)创建业务实体层
1.打开vs.net2002,新建一个项目,选Asp.NET Web服务,位置是: http://localhost/mydotnet/tiner/WebData/
2.WebService的代码

  1using System;
  2using System.Collections;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Data.SqlClient; 
  6using System.Diagnostics;
  7using System.Web;
  8using System.Web.Services;
  9using System.Web.UI;
 10using System.Web.UI.WebControls;
 11using System.Web.UI.HtmlControls;
 12
 13namespace WebData
 14{
 15/// <summary>
 16/// Service1 的摘要说明。
 17/// </summary>

 18[WebService (Namespace = "http://www.ourfly.com", Description = "<font size=4 color='#FF6633'><b><br><center>使用C#写的三层架构的程序。</center></b><br><br></font>")]
 19public class Service1 : System.Web.Services.WebService
 20{
 21SqlDataAdapter MyAdapter;
 22string strConn="data source=localhost;initial catalog=TestUser;uid=sa;pwd=";
 23
 24public Service1()
 25{
 26//CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的
 27InitializeComponent();
 28}

 29
 30Component Designer generated code
 56
 57//定义一个私有方法,用来判断用户是否存在
 58private Boolean BoolReg(string strRegName)
 59{
 60Boolean strResult;
 61SqlConnection cn;
 62SqlCommand cmd;
 63
 64string strSQL;
 65cn=new SqlConnection(strConn);
 66cn.Open();
 67
 68strSQL="select count(*) from Users where RegName='"+strRegName+"'";
 69cmd=new SqlCommand(strSQL,cn);
 70
 71SqlDataReader reader = cmd.ExecuteReader();
 72reader.Read();
 73int i = reader.GetInt32(0);
 74if (i>0)
 75
 76reader.Close();
 77cn.Close ();
 78strResult= true;
 79}

 80else
 81{
 82reader.Close(); 
 83cn.Close ();
 84strResult=false;
 85}

 86
 87return strResult;
 88}

 89
 90[WebMethod(Description="完成用户注册功能.")]
 91public string RegUser(string strTrueName,string strRegName,string strPwd,string strSex,string strEmail)
 92{
 93string strResult;
 94SqlConnection cn;
 95SqlCommand cmd;
 96
 97//判断用户是否存在
 98if (BoolReg(strRegName))
 99{
100strResult="这个用户已经存在,请重新注册";
101return strResult;
102}

103else
104{
105string strSQL;
106cn=new SqlConnection(strConn);
107cn.Open();
108
109strSQL="insert into Users (TrueName,RegName,Pwd,Sex,Email) values( '";
110strSQL+=strTrueName+"','";
111strSQL+=strRegName+"','";
112strSQL+=strPwd+"','";
113strSQL+=strSex+"','";
114strSQL+=strEmail+"')";
115
116cmd=new SqlCommand(strSQL,cn);
117
118try
119{
120cmd.ExecuteNonQuery();
121cn.Close ();
122strResult= "用户注册成功";
123}

124catch(Exception e)
125{
126cn.Close ();
127strResult="请仔细检查你的输入项";
128}

129}

130return strResult;
131
132}

133
134[WebMethod(Description="用户登录")]
135public string Login(string strRegName,string strPwd)
136{
137SqlConnection cn;
138SqlDataAdapter da;
139DataSet ds;
140string strSQL,strResult;
141
142strSQL="select TrueName,RegName,Pwd from Users where RegName='"+strRegName+"' and Pwd='"+strPwd+"'";
143
144cn=new SqlConnection(strConn);
145cn.Open();
146
147da=new SqlDataAdapter(strSQL,cn);
148ds=new DataSet();
149da.Fill(ds,"Users");
150
151if(ds.Tables["Users"].Rows.Count>0)
152{
153strResult= "登录成功";
154
155}

156else
157{
158strResult= "用户名或口令有误或者没有这个用户!请重新输入!";
159
160}

161cn.Close();
162return strResult;
163}

164
165
166[WebMethod(Description="得到数据集.")]
167public DataSet GetDataSet()
168{
169SqlConnection cn;
170cn=new SqlConnection(strConn);
171string strSel="select * from Customers";
172cn.Open();
173MyAdapter=new SqlDataAdapter(strSel,strConn);
174DataSet ds=new DataSet();
175MyAdapter.Fill(ds,"Customers");
176return ds;
177}

178}

179}

180


运行后如下图所示:

(3)Web表现层
打开vs.net2002,新建一个项目,选Asp.NET Web应用程序,位置是: http://localhost/mydotnet/tiner/WebApplication1
在解决方案资源管理器中,右键点击”引用”,选择”添加Web引用”, 输入http://localhost/mydotnet/tiner/WebData/Service1.asmx如下图所示:

添加引用后,如下图:
好了,我们开始写代码,详细代码如下:

  1using System;
  2using System.Collections;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Drawing;
  6using System.Web;
  7using System.Web.SessionState;
  8using System.Web.UI;
  9using System.Web.UI.WebControls;
 10using System.Web.UI.HtmlControls;
 11using System.Data.SqlClient; 
 12
 13namespace tiner
 14{
 15/// <summary>
 16/// WebForm1 的摘要说明。
 17/// </summary>

 18public class WebForm1 : System.Web.UI.Page
 19{
 20protected System.Web.UI.WebControls.Label Label1;
 21protected System.Web.UI.WebControls.DataGrid DataGrid1;
 22protected System.Web.UI.WebControls.Label Label2;
 23protected System.Web.UI.WebControls.Label Label3;
 24protected System.Web.UI.WebControls.TextBox TxtUserName;
 25protected System.Web.UI.WebControls.Button BtLogin;
 26protected System.Web.UI.WebControls.Button BtReg;
 27protected System.Web.UI.WebControls.Panel Panel1;
 28protected System.Web.UI.WebControls.Label Label4;
 29protected System.Web.UI.WebControls.Label Label5;
 30protected System.Web.UI.WebControls.TextBox TxtTrueName;
 31protected System.Web.UI.WebControls.Label Label6;
 32protected System.Web.UI.WebControls.Label Label7;
 33protected System.Web.UI.WebControls.Label Label8;
 34protected System.Web.UI.WebControls.Button BtOK;
 35protected System.Web.UI.WebControls.TextBox TxtRegName;
 36protected System.Web.UI.WebControls.TextBox TxtPwd;
 37protected System.Web.UI.WebControls.DropDownList DropDownListSex;
 38protected System.Web.UI.WebControls.TextBox TxtEmail;
 39protected System.Web.UI.WebControls.TextBox TxtPassword;
 40
 41string myResult;
 42DataSet ds;
 43localhost.Service1 myService =new localhost.Service1();
 44
 45private void Page_Load(object sender, System.EventArgs e)
 46{
 47// 在此处放置用户代码以初始化页面
 48if ( !Page.IsPostBack )
 49{
 50Panel1.Visible =false;
 51}

 52}

 53
 54Web Form Designer generated code
 77
 78
 79
 80private void BtReg_Click(object sender, System.EventArgs e)
 81{
 82DataGrid1.Visible =false;
 83Panel1.Visible =true;
 84}

 85
 86private void BtLogin_Click(object sender, System.EventArgs e)
 87{
 88if (TxtUserName.Text =="" || TxtPassword.Text=="")
 89{
 90Label1.Text ="请输入用户名或者密码";
 91return;
 92}

 93
 94DataGrid1.Visible =true;
 95Panel1.Visible =false;
 96myResult=myService.Login(TxtUserName.Text,TxtPassword.Text ) ;
 97if (myResult.ToString() =="登录成功")
 98{
 99ds=myService.GetDataSet();
100DataGrid1.DataSource =ds.Tables["Customers"]; 
101DataGrid1.DataBind(); 
102}

103else
104{
105Label1.Text ="用户名或口令有误或者没有这个用户!请重新输入!";
106}

107}

108
109private void BtOK_Click(object sender, System.EventArgs e)
110{
111myResult=myService.RegUser(TxtTrueName.Text,TxtRegName.Text,TxtPwd.Text,DropDownListSex.SelectedItem.Text ,TxtEmail.Text);
112if(myResult.ToString()=="用户注册成功" )
113{
114Label1.Text ="用户注册成功,可以登录查看信息";
115return;
116}

117else if(myResult.ToString()=="这个用户已经存在,请重新注册" ) 
118{
119Label1.Text ="这个用户已经存在,请重新注册";
120return;
121}

122else
123{
124Label1.Text ="用户注册发生错误,请检查每一项";
125return;
126}

127
128}

129
130}

131}

132


运行启动,输入正确的用户名和密码,点击”登录”按钮,会看到下面的界面:
点击”注册新用户”,出现注册界面,如果注册的用户存在,会产生提示:
总结:
Web表示层上完全没有数据库连接操作,它与数据库的连接任务是通过业务层来完成的,这样,程序的结构更加清晰。当然,程序中可以增加其它的层,如:业务规则层等。
如果错误,欢迎大家指教。