您的位置:首页 > 编程语言 > C#

C#版七层登陆

2015-07-18 15:16 381 查看
因为重构决心用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#时避免很多麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: