把VB.NET七层登录敲完了,想再用C#来一遍,主要是想学习一下两种语言的转换和区别。下面的图以第一个为准,第二个系统原因删不掉。
七层架构的思想在之前说过了,那么话不多说,下面是C#代码:
配置文件App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key ="ConnStr" value="server=Localhost; database=charge_sys;User ID = sa ; Password=123"/>
<!--<add key ="DB" value="DAL" />-->
<!--SqlServer是D层类的前缀,用来区别使用的是什么类型的数据库-->
<add key ="DB" value="SqlServer" />
</appSettings>
</configuration>
Entity层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Entity
{
public class UserInfo
{
private string _userName;
private string _passWord;
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
public string Password
{
get { return _passWord; }
set { _passWord = value; }
}
}
}
SqlHelper类,放在DAL层里面。它的作用是封装了常用的4种连接数据库的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
namespace DAL
{
public class SqlHelper
{
public DataTable ExecuteNonQuery(string cmdTxt, CommandType cmdType, SqlParameter[] paras)
{
string StrDB = System.Configuration.ConfigurationManager.AppSettings["ConnStr"];
//接收来自配置文件的数据
SqlConnection conn = new SqlConnection(StrDB);
//创建数据库的连接
SqlCommand cmd = default(SqlCommand);
//定义命名变量
DataSet adataset = null;
//定义数据适配器,DataSet类表示一个存放在内存中的数据缓存
SqlDataAdapter adapter = default(SqlDataAdapter);
//sqldataadapter类目的是填充dataset
cmd = new SqlCommand(cmdTxt, conn);
//在conn上面执行实例化命令变量,并执行语句cmdtype
cmd.CommandType = cmdType;
//命令执行类型
cmd.Parameters.AddRange(paras);
//命令执行的参数
adapter = new SqlDataAdapter(cmd);
//初始化sqldataadapter类的新实例,用指定的cmd作为selectcommand的属性
adataset = new DataSet();
try
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
adapter.Fill(adataset);
//向adapter对象中填充查询的数据
}
catch (Exception ex)
{
//Interaction.Msgbox(ex.Message);
//MessageBox.Show(ex.Message);
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
return adataset.Tables[0];
//获取包含在dataset中的表的集合
}
public string ConnStr { get; set; }
}
}
完整的SqlHelper(用于重构和合作)
/*
* 创建人:
* 创建时间:
* 说明:数据库助手类
* 版权所有:
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class SQLHelper
{
#region 构造函数
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
private SqlConnection conn = null;
public SQLHelper()
{
string connStr = ConfigurationManager.AppSettings["connStr"];
conn = new SqlConnection(connStr);
}
#endregion
#region SQL连接打开
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
#endregion
#region 非存储过程
/// <summary>
/// 不带参数增删改SQL语句
/// </summary>
/// <param name="sql">需要操作的sql语句</param>
/// <returns>更新的记录数</returns>
public int ExecuteNonQuery(string sql)
{
int res;
using (cmd = new SqlCommand(sql, GetConn()))
{
res = cmd.ExecuteNonQuery();
}
return res;
}
/// <summary>
/// 带参数的增删改SQL语句
/// </summary>
/// <param name="sql">需要操作的sql语句</param>
/// <returns>更新的记录数</returns>
public int ExecuteNonQuery(string sql, SqlParameter[] paras)
{
int res;
using (cmd = new SqlCommand(sql, GetConn()))
{
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
/// <summary>
/// 不带参数的SQL查询语句
/// </summary>
/// <param name="sql">需要操作的sql语句</param>
/// <returns>返回查询出的记录</returns>
public DataTable ExecuteQuery(string sql)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(sql, GetConn());
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
/// <summary>
/// 带参数SQL查询语句
/// </summary>
/// <param name="sql">需要查询的SQL语句</param>
/// <param name="paras">传入的参数</param>
/// <returns>返回查询的记录</returns>
public DataTable ExecuteQuery(string sql, SqlParameter[] paras)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(sql, GetConn());
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
#endregion
#region 存储过程
/// <summary>
/// 带参数的查询
/// </summary>
/// <param name="cmdtext"></param>
/// <param name="paras"></param>
/// <param name="ct"></param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdtext, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdtext, GetConn());
cmd.Parameters.AddRange(paras);
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
/// <summary>
/// 不带参数的查询
/// </summary>
/// <param name="sql"></param>
/// <param name="ct"></param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdtext, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdtext, GetConn());
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
/// <summary>
/// 带参数的增删改
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <param name="ct"></param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdtext, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdtext, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
/// <summary>
/// 不带参数的增删改
/// </summary>
/// <param name="cmdtext"></param>
/// <param name="ct"></param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdtext, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdtext, GetConn()))
{
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
return res;
}
#endregion
}
}
DAL层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using SqlHelper;
namespace DAL
{
public class LoginDAL:IDAL.LoginIDAL
{
public DataTable selectUser(Entity.UserInfo UserInfo)
{
CommandType Text = 0;
sqlHelper sqlhelper = new SqlHelper.sqlHelper ();
SqlParameter[] sqlParams = { new SqlParameter("@UserName", UserInfo.UserName), new SqlParameter("@PassWord", UserInfo.Password) };
string sql = @"select*from User_Info where userID=@UserName and PWD=@PassWord";
DataTable table = sqlhelper.ExecuteNonQuery(sql, Text, sqlParams);
return table;
}
}
}
IDAL接口层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace IDAL
{
public interface LoginIDAL
{
//定义了方法,返回类型是DataTable
DataTable selectUser(Entity.UserInfo UserInfo);
}
}
Factory层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration; //对配置文件的引用
using System.Reflection; //对反射的引用
using System.IO;
namespace Factory
{
public class LoginFactory
{
//数据程序集名称,命名空间(DAL)
string AssemblyName = "DAL";
//接收来自配置文件的数据, 这里是接收D层类名的前缀,用来区别数据库类型
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
/// <summary>
/// 登录信息
/// </summary>
/// <returns></returns>
public IDAL.LoginIDAL CreateUser()
{
//字符串拼接,这样写就能准确获取D层的具体某个类
string ClassName = AssemblyName +"."+ StrDB + "LoginDAL";
//定义接口类型idal,来接收返回值
IDAL.LoginIDAL idal = (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(className);//反射加工厂的应用
return idal;
}
}
}
BLL层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Data;
namespace BLL
{
public class LoginBLL
{
public bool UserBLL(Entity.UserInfo UserInfo)
{
Factory.LoginFactory fact = new Factory.LoginFactory();//实例化工厂
IDAL.LoginIDAL idal = fact.CreateUser();//调用工厂方法创建接口
DataTable table = idal.selectUser(UserInfo);//接受D层的返回值
Boolean flag;
if (table.Rows.Count == 0)
{
flag = false;
}
else
{
flag = true;
}
return flag;
}
}
}
Facade层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Facade
{
public class LoginFacade
{
public Boolean SelectUser(Entity.UserInfo UserInfo)
{
bool flag;
BLL.LoginBLL userBLL = new BLL.LoginBLL();
flag = userBLL.UserBLL(UserInfo);
return flag;
}
}
}
UI层
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnOK_Click(object sender, EventArgs e)
{
string UserName = txtUserID.Text.Trim();
string Password = txtUserPWD.Text;
//验证是否为空
if (txtUserID.Text == string.Empty)
{
MessageBox.Show("请输入账号!", "登录");
return;
}
else
{
if (txtUserPWD.Text == string.Empty)
{
MessageBox.Show("请输入密码!", "登录");
return;
}
//#region 登录
try
{
Facade.LoginFacade fLogin = new Facade.LoginFacade();//实例化外观
Entity.UserInfo user = new Entity.UserInfo();
//调用外观的方法,返回给user
user.UserName = Convert.ToString(txtUserID.Text.Trim());
user.Password = Convert.ToString(txtUserPWD.Text);
Boolean flag = false;
flag = fLogin.SelectUser(user);
if (flag != false)
{
MessageBox.Show("登录成功!");
//this.Hide();
//this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
else
{
MessageBox.Show("密码或者用户名错误");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
//#endregion
小结:
通过比较发现,C#和 VB.NET的差别很小,只是语法结构稍有差别,大部分的东西还是很相似的。
我个人感觉C#更简洁一些,在面向对象方面更具有优势!