CSDN博客

img online

如何使用C#创建一个三层的数据库应用程序

发表于2004/1/8 11:38:00  1853人阅读

如何使用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/
2WebService的代码
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient; 
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
 
namespace WebData
{
    /// <summary>
    /// Service1 的摘要说明。
    /// </summary>
    [WebService (Namespace = "http://www.ourfly.com", Description = "<font size=4 color='#FF6633'><b><br><center>使用C#写的三层架构的程序。</center></b><br><br></font>")]
    public class Service1 : System.Web.Services.WebService
    {
        SqlDataAdapter MyAdapter;
        string strConn="data source=localhost;initial catalog=TestUser;uid=sa;pwd=";
               
        public Service1()
        {
            //CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的
            InitializeComponent();
        }
 
        #region Component Designer generated code
       
        //Web 服务设计器所必需的
        private IContainer components = null;
               
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
        }
 
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if(disposing && components != null)
            {
                components.Dispose();
            }
            base.Dispose(disposing);       
        }
       
        #endregion
 
//定义一个私有方法,用来判断用户是否存在
        private Boolean BoolReg(string strRegName)
        {
            Boolean strResult;
            SqlConnection cn;
            SqlCommand cmd;
           
            string strSQL;
            cn=new  SqlConnection(strConn);
            cn.Open();
           
            strSQL="select count(*) from Users where RegName='"+strRegName+"'";
            cmd=new SqlCommand(strSQL,cn);
           
            SqlDataReader reader = cmd.ExecuteReader();
            reader.Read();
            int i = reader.GetInt32(0);
            if (i>0)
            {  
                reader.Close();
                cn.Close ();
                strResult= true;
            }
            else
            {
                reader.Close();
                cn.Close ();
                strResult=false;
            }
   
            return strResult;
        }
 
        [WebMethod(Description="完成用户注册功能.")]
        public string RegUser(string strTrueName,string strRegName,string strPwd,string strSex,string strEmail)
        {
            string strResult;
            SqlConnection cn;
            SqlCommand cmd;
           
            //判断用户是否存在
            if (BoolReg(strRegName))
                   {
                       strResult="这个用户已经存在,请重新注册";
                       return strResult;
                   }
            else
            {
                string strSQL;
                cn=new  SqlConnection(strConn);
                cn.Open();
           
                strSQL="insert into Users (TrueName,RegName,Pwd,Sex,Email) values( '";
                strSQL+=strTrueName+"','";
                strSQL+=strRegName+"','";
                strSQL+=strPwd+"','";
                strSQL+=strSex+"','";
                strSQL+=strEmail+"')";
 
                cmd=new SqlCommand(strSQL,cn);
                   
                try
                {
                    cmd.ExecuteNonQuery();
                    cn.Close ();
                    strResult= "用户注册成功";
                }
                catch(Exception e)
                {
                    cn.Close ();
                    strResult="请仔细检查你的输入项";
                }
            }
            return strResult;
   
        }
 
        [WebMethod(Description="用户登录")]
        public string Login(string strRegName,string strPwd)
        {
            SqlConnection cn;
            SqlDataAdapter da;
            DataSet ds;
            string strSQL,strResult;
           
            strSQL="select TrueName,RegName,Pwd from Users  where RegName='"+strRegName+"' and Pwd='"+strPwd+"'";
           
            cn=new SqlConnection(strConn);
            cn.Open();
 
            da=new SqlDataAdapter(strSQL,cn);
            ds=new DataSet();
            da.Fill(ds,"Users");
 
            if(ds.Tables["Users"].Rows.Count>0)
            {
                strResult= "登录成功";
 
            }
            else
            {
                strResult= "用户名或口令有误或者没有这个用户!请重新输入!";
   
            }
            cn.Close();
            return strResult;
        }
 
 
        [WebMethod(Description="得到数据集.")]
        public DataSet GetDataSet()
        {
            SqlConnection cn;
            cn=new SqlConnection(strConn);
            string strSel="select * from Customers";
            cn.Open();
            MyAdapter=new SqlDataAdapter(strSel,strConn);
            DataSet ds=new DataSet();
            MyAdapter.Fill(ds,"Customers");
            return ds;
        }
    }
}
 
运行后如下图所示:
 
 
(3)Web表现层
打开vs.net2002,新建一个项目,选Asp.NET Web应用程序,位置是: http://localhost/mydotnet/tiner/WebApplication1
在解决方案资源管理器中,右键点击引用”,选择添加Web引用”, 输入http://localhost/mydotnet/tiner/WebData/Service1.asmx如下图所示:
 添加引用后,如下图:
 
好了,我们开始写代码,详细代码如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
 
namespace tiner
{
     /// <summary>
     /// WebForm1 的摘要说明。
     /// </summary>
     public class WebForm1 : System.Web.UI.Page
     {
         protected System.Web.UI.WebControls.Label Label1;
         protected System.Web.UI.WebControls.DataGrid DataGrid1;
         protected System.Web.UI.WebControls.Label Label2;
         protected System.Web.UI.WebControls.Label Label3;
         protected System.Web.UI.WebControls.TextBox TxtUserName;
         protected System.Web.UI.WebControls.Button BtLogin;
         protected System.Web.UI.WebControls.Button BtReg;
         protected System.Web.UI.WebControls.Panel Panel1;
         protected System.Web.UI.WebControls.Label Label4;
         protected System.Web.UI.WebControls.Label Label5;
         protected System.Web.UI.WebControls.TextBox TxtTrueName;
         protected System.Web.UI.WebControls.Label Label6;
         protected System.Web.UI.WebControls.Label Label7;
         protected System.Web.UI.WebControls.Label Label8;
         protected System.Web.UI.WebControls.Button BtOK;
         protected System.Web.UI.WebControls.TextBox TxtRegName;
         protected System.Web.UI.WebControls.TextBox TxtPwd;
         protected System.Web.UI.WebControls.DropDownList DropDownListSex;
         protected System.Web.UI.WebControls.TextBox TxtEmail;
         protected System.Web.UI.WebControls.TextBox TxtPassword;
    
         string myResult;
         DataSet ds;
         localhost.Service1 myService =new localhost.Service1();
 
         private void Page_Load(object sender, System.EventArgs e)
         {
              // 在此处放置用户代码以初始化页面
              if ( !Page.IsPostBack )
              {
                   Panel1.Visible =false;
              }
         }
 
         #region Web Form Designer generated code
         override protected void OnInit(EventArgs e)
         {
              //
              // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
              //
              InitializeComponent();
              base.OnInit(e);
         }
        
         /// <summary>
         /// 设计器支持所需的方法 - 不要使用代码编辑器修改
         /// 此方法的内容。
         /// </summary>
         private void InitializeComponent()
         {   
              this.BtLogin.Click += new System.EventHandler(this.BtLogin_Click);
              this.BtReg.Click += new System.EventHandler(this.BtReg_Click);
              this.BtOK.Click += new System.EventHandler(this.BtOK_Click);
              this.Load += new System.EventHandler(this.Page_Load);
 
         }
         #endregion
 
 
 
         private void BtReg_Click(object sender, System.EventArgs e)
         {
              DataGrid1.Visible =false;
              Panel1.Visible =true;
         }
 
         private void BtLogin_Click(object sender, System.EventArgs e)
         {
              if (TxtUserName.Text =="" || TxtPassword.Text=="")
              {
                   Label1.Text ="请输入用户名或者密码";
                   return;
              }
 
              DataGrid1.Visible =true;
              Panel1.Visible =false;
              myResult=myService.Login(TxtUserName.Text,TxtPassword.Text ) ;
              if (myResult.ToString() =="登录成功")
              {
                   ds=myService.GetDataSet();
                   DataGrid1.DataSource =ds.Tables["Customers"];
                   DataGrid1.DataBind();
              }
              else
              {
                   Label1.Text ="用户名或口令有误或者没有这个用户!请重新输入!";
              }
         }
 
         private void BtOK_Click(object sender, System.EventArgs e)
         {
              myResult=myService.RegUser(TxtTrueName.Text,TxtRegName.Text,TxtPwd.Text,DropDownListSex.SelectedItem.Text ,TxtEmail.Text);
              if(myResult.ToString()=="用户注册成功" )
              {
                   Label1.Text ="用户注册成功,可以登录查看信息";
                   return;
              }
              else if(myResult.ToString()=="这个用户已经存在,请重新注册" )
              {
                   Label1.Text ="这个用户已经存在,请重新注册";
                   return;
              }
              else
              {
                   Label1.Text ="用户注册发生错误,请检查每一项";
                   return;
              }
 
         }
 
     }
}
运行启动,输入正确的用户名和密码,点击登录按钮,会看到下面的界面:
 
点击注册新用户”,出现注册界面,如果注册的用户存在,会产生提示:
 
总结:
Web表示层上完全没有数据库连接操作,它与数据库的连接任务是通过业务层来完成的,这样,程序的结构更加清晰。当然,程序中可以增加其它的层,如:业务规则层等。
如果错误,欢迎大家指教。
0 0

相关博文

我的热门文章

img
取 消
img