C#版七层登陆
2015-07-18 15:16
381 查看
因为重构决心用C#语言,故而在先用C#练练手。这篇博客参考了很多大家的.net重构做七层登陆的文章。期间遇到一些问题解决得颇为艰辛,不过解决之后感觉还是不错的,而且在调试的时候多亏了“教授”的帮助。下面就言归正传展示一下我的代码和思路吧。
这里我也用到了SqlHelper,总的来说就是从U层传进数据,传给外观层,外观层将数据传给B层,B层通过抽象工厂 + 反射的技术对接口进行实现,而D层又实现了接口的方法,进而从数据库中选择所需的数据,然后将数据返回到B层。
配置文件
B层
工厂类
接口
D层
SqlHelper层
还是先看一下包图
这里我也用到了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#时避免很多麻烦。相关文章推荐
- 【转】C# WinForm窗体及其控件的自适应
- c# XML和实体类之间相互转换(序列化和反序列化)
- C#类的扩展
- C#异步调用的好处和方法
- C# 中的委托和事件
- C#泛型详解
- C#参数类型 params、out和ref
- 在C#中ParameterizedThreadStart和ThreadStart区别
- C#不定参数函数
- C#中Invoke的用法(转)
- C#中Thread.IsBackground 属性
- C# goto 语句
- C# DataTable中返回列中的最大值
- C# DataTable中返回列中的最大值
- C#中按指定质量保存图片的实例代码 24位深度
- C#中 ArrayList与string,string[],List<string> 数组集合转换
- 集合中取出列名相同的,并把其他列的值合并成数组
- C#时间戳和时间互转
- C# 中通过CancellationTokenSource实现对超时任务的取消
- C# set get