C#版七层登陆

因为重构决心用C#语言,故而在先用C#练练手。这篇博客参考了很多大家的.net重构做七层登陆的文章。期间遇到一些问题解决得颇为艰辛,不过解决之后感觉还是不错的,而且在调试的时候多亏了“教授”的帮助。下面就言归正传展示一下我的代码和思路吧。

还是先看一下包图

用到的包图截取别人的,偷下懒
这里我也用到了SqlHelper,总的来说就是从U层传进数据,传给外观层,外观层将数据传给B层,B层通过抽象工厂 + 反射的技术对接口进行实现,而D层又实现了接口的方法,进而从数据库中选择所需的数据,然后将数据返回到B层。

代码展示

U层

using System.Data;//引用命名空间
private void btnLogin_Click(object sender, EventArgs e)
        {
            if(txtUserID.Text!=""){//当用户名为空时错误发生在数据传入时故而在U层判断更为合适
            Login.Model.UserInfo user=new Login.Model.UserInfo();
            user.UserID=int.Parse(txtUserID.Text.Trim()); /*显式转换输入的string为int类型,因为数据库中UserID为int类型,故实体类设计时UseriD为int类型*/
            user.Password=txtPassword.Text;

            Facade.LoginFacade loginfacade = new Facade.LoginFacade(); //实例化登陆外观将参数传递给外观层
            DataTable userback =new DataTable(); 
            userback=loginfacade.UserLogin(user);

            MessageBox.Show("登陆成功" + userback.Rows[0]["username"]);//登陆成功提示信息
            }
            else{
                MessageBox.Show("用户名不能为空!");
            }
        }

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <appSettings>
      <add key="ConnStr" value="server=.;database=charge_sys;User ID=sa;password=123456"/>      
      <add key="DB" value="DAL"/>
    </appSettings>
</configuration>

B层

using System.Data;//引用命名空间
public class LoginManager
    {
        public DataTable LoginUser(Login.Model.UserInfo user)
        {                      
            Factory.LoginFactory factory = new Factory.LoginFactory();
            IDAL.IuserinfoDAL Iuser = factory.CreateUserInfo();
            //实例化接口为:已经通过抽象工厂+反射选择数据库后的DAL层。            
            DataTable userbacktable =new DataTable();
            userbacktable =Iuser.selectUser(user);
            //通过该DAL层返回table,也就是说这个接口方法的实现是通过该DAL层实现的。  
            return userbacktable;            
        }        
    }

工厂类

using System.Configuration; //对配置文件进行引用
using System.Reflection;    //对反射引用
using IDAL;                 //引用接口
public class LoginFactory
    {
        //选择数据库,通过配置文件给DB赋值
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];

        public IuserinfoDAL CreateUserInfo()
        {
            //C#中强制类型转换,在C#中没有Ctype函数
            IuserinfoDAL Iuser =(IuserinfoDAL)Assembly.Load("LoginDAL").CreateInstance("Login.DAL"+"."+ "UserDAO");

            return Iuser;
        }
    }

接口

    public interface IuserinfoDAL
    {
        //注意C#中定义接口的不同
        DataTable selectUser(Login.Model.UserInfo user);        
    }

D层

using System.Data ;
using System.Data.SqlClient;
    public class UserDAO:IDAL.IuserinfoDAL
    {
        public DataTable selectUser(Login.Model.UserInfo user)
        {   
            //对比vb语言可以看出C#语言的简洁性
            SqlParameter[] sqlParams = {new SqlParameter("@userID", user.UserID),new SqlParameter("@PWD", user.Password)};
            string sql = "select * from [User_Info] where UserID=@UserID and PWD =@PWD";
            DataTable table = SqlHelper.SqlHelper.GetDataTable(sql, CommandType.Text, sqlParams);

            return table;
        }
    }

SqlHelper层

//引入命名空间
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using Microsoft.VisualBasic;
    public class SqlHelper
    {
    public static string connectionString = ConfigurationManager.AppSettings["ConnStr"];

        /// <summary>  
        ///执行带参数的查询方式,返回值为表。  
        /// <param name="cmdTxt" >参数cmdText为所要执行的sql语句</param >  
        /// <param name=" cmdType">查询时的查询方式</param>   
        /// <param name="paras" >查询时的命令参数</param>  
        /// <returns >查询后以表的形式返回,</returns >  
        /// </summary>  
        /// <remarks></remarks>  

        public static DataTable GetDataTable(string cmdTxt, CommandType cmdType, SqlParameter[] paras)
        {

            SqlConnection conn = new SqlConnection(connectionString);
            //创建数据库的连接  
            SqlCommand cmd = default(SqlCommand);
            //定义命名变量  
            DataSet adataset = null;
            //定义数据适配器,DataSet类表示一个存放于内存中的数据缓存  
            SqlDataAdapter adaptor = default(SqlDataAdapter);
            //SqlDataAdapter类目的是填充DataSet  
            cmd = new SqlCommand(cmdTxt, conn);
            //在conn上面执行实例化命令变量,并执行语句cmdtype  
            cmd.CommandType = cmdType;
            //命令执行的类型  
            cmd.Parameters.AddRange(paras);
            //命令执行的参数  
            adaptor = new SqlDataAdapter(cmd);
            //初始化 SqlDataAdapter 类的新实例,用指定的 cmd 作为 SelectCommand 的属性  
            adataset = new DataSet();
            try {
                if (conn.State == ConnectionState.Closed) {
                    conn.Open();
                }
                adaptor.Fill(adataset);
                //向adaptor对象中填充查询的数据  
            } catch (Exception ex) {
                Interaction.MsgBox(ex.Message);
            } finally {
                if (conn.State == ConnectionState.Open) {
                    conn.Close();
                }
            }
            return adataset.Tables[0];
            //获取包含在 DataSet 中的表的集合。  

        }
     }

总结

对比vb语言有很多不同之处,多在细节的方面,比方说定义连接字符串的时候vb这样写:Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings(“DB”);但是在C#中带有()的一般都作为方法,所以就会报错,C#中的语句应该这样string strDB = System.Configuration.ConfigurationSettings.AppSettings[“DB”];多注重细节会在我们由.net到C#时避免很多麻烦。

评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值