如何使用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的代码
using System;2
using System.Collections;3
using System.ComponentModel;4
using System.Data;5
using System.Data.SqlClient; 6
using System.Diagnostics;7
using System.Web;8
using System.Web.Services;9
using System.Web.UI;10
using System.Web.UI.WebControls;11
using System.Web.UI.HtmlControls;12

13
namespace WebData14
{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>")]19
public class Service1 : System.Web.Services.WebService20
{21
SqlDataAdapter MyAdapter;22
string strConn="data source=localhost;initial catalog=TestUser;uid=sa;pwd=";23

24
public Service1()25
{26
//CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的27
InitializeComponent();28
}29

30
Component Designer generated code56

57
//定义一个私有方法,用来判断用户是否存在58
private Boolean BoolReg(string strRegName)59
{60
Boolean strResult;61
SqlConnection cn;62
SqlCommand cmd;63

64
string strSQL;65
cn=new SqlConnection(strConn);66
cn.Open();67

68
strSQL="select count(*) from Users where RegName='"+strRegName+"'";69
cmd=new SqlCommand(strSQL,cn);70

71
SqlDataReader reader = cmd.ExecuteReader();72
reader.Read();73
int i = reader.GetInt32(0);74
if (i>0)75
{ 76
reader.Close();77
cn.Close ();78
strResult= true;79
}80
else81
{82
reader.Close(); 83
cn.Close ();84
strResult=false;85
}86

87
return strResult;88
}89

90
[WebMethod(Description="完成用户注册功能.")]91
public string RegUser(string strTrueName,string strRegName,string strPwd,string strSex,string strEmail)92
{93
string strResult;94
SqlConnection cn;95
SqlCommand cmd;96

97
//判断用户是否存在98
if (BoolReg(strRegName))99
{100
strResult="这个用户已经存在,请重新注册";101
return strResult;102
}103
else104
{105
string strSQL;106
cn=new SqlConnection(strConn);107
cn.Open();108

109
strSQL="insert into Users (TrueName,RegName,Pwd,Sex,Email) values( '";110
strSQL+=strTrueName+"','";111
strSQL+=strRegName+"','";112
strSQL+=strPwd+"','";113
strSQL+=strSex+"','";114
strSQL+=strEmail+"')";115

116
cmd=new SqlCommand(strSQL,cn);117

118
try119
{120
cmd.ExecuteNonQuery();121
cn.Close ();122
strResult= "用户注册成功";123
}124
catch(Exception e)125
{126
cn.Close ();127
strResult="请仔细检查你的输入项";128
}129
}130
return strResult;131

132
}133

134
[WebMethod(Description="用户登录")]135
public string Login(string strRegName,string strPwd)136
{137
SqlConnection cn;138
SqlDataAdapter da;139
DataSet ds;140
string strSQL,strResult;141

142
strSQL="select TrueName,RegName,Pwd from Users where RegName='"+strRegName+"' and Pwd='"+strPwd+"'";143

144
cn=new SqlConnection(strConn);145
cn.Open();146

147
da=new SqlDataAdapter(strSQL,cn);148
ds=new DataSet();149
da.Fill(ds,"Users");150

151
if(ds.Tables["Users"].Rows.Count>0)152
{153
strResult= "登录成功";154

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

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

165

166
[WebMethod(Description="得到数据集.")]167
public DataSet GetDataSet()168
{169
SqlConnection cn;170
cn=new SqlConnection(strConn);171
string strSel="select * from Customers";172
cn.Open();173
MyAdapter=new SqlDataAdapter(strSel,strConn);174
DataSet ds=new DataSet();175
MyAdapter.Fill(ds,"Customers");176
return 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如下图所示:
添加引用后,如下图:
好了,我们开始写代码,详细代码如下:
using System;2
using System.Collections;3
using System.ComponentModel;4
using System.Data;5
using System.Drawing;6
using System.Web;7
using System.Web.SessionState;8
using System.Web.UI;9
using System.Web.UI.WebControls;10
using System.Web.UI.HtmlControls;11
using System.Data.SqlClient; 12

13
namespace tiner14
{15
/// <summary>16
/// WebForm1 的摘要说明。17
/// </summary>18
public class WebForm1 : System.Web.UI.Page19
{20
protected System.Web.UI.WebControls.Label Label1;21
protected System.Web.UI.WebControls.DataGrid DataGrid1;22
protected System.Web.UI.WebControls.Label Label2;23
protected System.Web.UI.WebControls.Label Label3;24
protected System.Web.UI.WebControls.TextBox TxtUserName;25
protected System.Web.UI.WebControls.Button BtLogin;26
protected System.Web.UI.WebControls.Button BtReg;27
protected System.Web.UI.WebControls.Panel Panel1;28
protected System.Web.UI.WebControls.Label Label4;29
protected System.Web.UI.WebControls.Label Label5;30
protected System.Web.UI.WebControls.TextBox TxtTrueName;31
protected System.Web.UI.WebControls.Label Label6;32
protected System.Web.UI.WebControls.Label Label7;33
protected System.Web.UI.WebControls.Label Label8;34
protected System.Web.UI.WebControls.Button BtOK;35
protected System.Web.UI.WebControls.TextBox TxtRegName;36
protected System.Web.UI.WebControls.TextBox TxtPwd;37
protected System.Web.UI.WebControls.DropDownList DropDownListSex;38
protected System.Web.UI.WebControls.TextBox TxtEmail;39
protected System.Web.UI.WebControls.TextBox TxtPassword;40

41
string myResult;42
DataSet ds;43
localhost.Service1 myService =new localhost.Service1();44

45
private void Page_Load(object sender, System.EventArgs e)46
{47
// 在此处放置用户代码以初始化页面48
if ( !Page.IsPostBack )49
{50
Panel1.Visible =false;51
}52
}53

54
Web Form Designer generated code77

78

79

80
private void BtReg_Click(object sender, System.EventArgs e)81
{82
DataGrid1.Visible =false;83
Panel1.Visible =true;84
}85

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

94
DataGrid1.Visible =true;95
Panel1.Visible =false;96
myResult=myService.Login(TxtUserName.Text,TxtPassword.Text ) ;97
if (myResult.ToString() =="登录成功")98
{99
ds=myService.GetDataSet();100
DataGrid1.DataSource =ds.Tables["Customers"]; 101
DataGrid1.DataBind(); 102
}103
else104
{105
Label1.Text ="用户名或口令有误或者没有这个用户!请重新输入!";106
}107
}108

109
private void BtOK_Click(object sender, System.EventArgs e)110
{111
myResult=myService.RegUser(TxtTrueName.Text,TxtRegName.Text,TxtPwd.Text,DropDownListSex.SelectedItem.Text ,TxtEmail.Text);112
if(myResult.ToString()=="用户注册成功" )113
{114
Label1.Text ="用户注册成功,可以登录查看信息";115
return;116
}117
else if(myResult.ToString()=="这个用户已经存在,请重新注册" ) 118
{119
Label1.Text ="这个用户已经存在,请重新注册";120
return;121
}122
else123
{124
Label1.Text ="用户注册发生错误,请检查每一项";125
return;126
}127

128
}129

130
}131
}132

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


浙公网安备 33010602011771号