C#深入.NET平台的软件系统分层开发
今天我们来讲讲分层开发,你从标题能不能简单的认识一下什么是分层呢?
不懂也没关系,接下来我来给你讲讲。
第一章 软件系统的分层开发
(1)其实分层模式可以这样定义:将解决方案中功能不同的模块分到不同的项目中实现,每一层中的组件应保持内聚性,每一层都应该与它下面的各层保持松耦合。
分层模式是最常见的一种架构模式,甚至可以说分层模式是很多架构模式的基础。
数据访问层:
这一层处于最底层,负责与数据库的交互,也成为DAL(Data Access Layer)
表示层:
这一层直接与用户打交道,负责显示或者获取数据,也称为UI(User Interface Layer)
(2).NET程序集是任何.NET Framework应用程序的基本构造块。程序集由描述它的程序集清单(包含版本号,程序集名称等),类型元数据,MSIL代码和资源组成,
这些部分都分布在一个文件中。
程序集主要包括以下两类:
(1)可执行文件,即.exe文件 (2)类库文件,即.dll文件
(3)程序集,解决方案,项目和命名空间的关系如下:
(1)一个解决方案可以由一个或者多个项目组成,这些项目可以是Windows应用程序,类库等。
(2)一个程序集可以包含多个命名空间,程序集默认的命名空间名称就是程序集的名称。
(3)命名空间是组织C#程序的一种逻辑架构,一个命名空间可以有多个类。
(4)分层开发的优点:
(1)代码的复用(2)分离开发人员的关注(3)无损提换(4)降低了系统间的依赖
(5)异常处理
常见的异常类型:
System.Exception :这个类提供系统异常和应用程序异常之间的区别
System.SQLException :当SQL Server返回警告或者错误时引发的异常
ArgumentNullException :当将空引用传递给不接受它作为有效参数的方法时引发的异常
FileNotFoundException :试图访问磁盘上不存在的文件失败时引发的异常
IOException :当出现I/O错误时,引发此异常
ApplicationException :在应用程序执行过程中检测到由应用程序定义的异常
异常类的常用属性:
Message :提供引起异常的详细信息
Source :表示导致异常发生的应用程序或者对象的名称
StackTrace :提供在栈堆上所调用方法的详细信息,并首先显示最近调用的方法
InnerException :对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生的异常
(6)异常处理回顾
语法:
try-catch
try
{
//可能引发异常的工作代码
}
catch(异常对象)
{
//异常处理
} try-finally
try
{
//可能引发异常的工作代码
}
finally
{
//清理相关对象的代码
} try-catch-finally
try
{
//可能引发异常的工作代码
}
catch(异常对象)
{
//异常处理
}
finally
{
//清理相关对象的代码
}
上面的文字都是枯燥的,接下来用代码来演示一下:
/// <summary>
/// 数据访问层
/// </summary>
public class StudentDAL
{ public void AddStudent()
{ } public DataTable SelectStudent()
{
string str = "Data Source=.; initial catalog=MySchools;user id=sa;";
string sql = "select * from student ";
SqlConnection con = new SqlConnection(str);
SqlDataAdapter da = new SqlDataAdapter(sql,con);
DataSet ds = new DataSet(); try
{
//int num = 0;
//int result = 1 / num;
da.Fill(ds, "stuInfo");
return ds.Tables["stuInfo"];
}
catch (SqlException ex)
{ throw new Exception("访问数据库失败" + ex.Message);
}
catch (DivideByZeroException ex)
{ throw new Exception("除数不能为0" + ex.Message);
}
catch (Exception ex)
{ throw new Exception("失败" + ex.Message);
} }
/// <summary>
/// 数据访问层
/// </summary>
public class GradeDAL
{
public DataTable SelectGrade()
{
string str = "data source=.; initial catalog=MySchools; user id=sa;";
string sql = "select * from Grade";
SqlConnection con = new SqlConnection(str);
SqlDataAdapter da = new SqlDataAdapter(sql,con);
DataSet ds = new DataSet();
da.Fill(ds,"gradeInfo"); return ds.Tables["gradeInfo"];
}
}
private void Form1_Load(object sender, EventArgs e)
{
StudentDAL dal = new StudentDAL();
GradeDAL grade = new GradeDAL();
try
{
DataTable data = dal.SelectStudent();
DataTable table = grade.SelectGrade();
dgvList.DataSource = data; comboBox1.DataSource = grade.SelectGrade();
comboBox1.DisplayMember = "GradeName";
comboBox1.ValueMember = "GradeId";
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
} }
第二章 OOP典型应用:实体类
(1)实体类是业务对象的基础,它用面向对象的思想消除了关系数据与对象之间的差异
实体类:
/// <summary>
/// 部门表
/// </summary>
public class Department
{
public int BId { get; set; }
public int BName{ get; set; } }
/// <summary>
/// 员工表
/// </summary>
public class Employee
{
public int YId{ get; set; }
public int YName{ get; set; }
public int BId{ get; set; }
public int ZId{ get; set; }
}
/// <summary>
/// 任务内容表
/// </summary>
public class Task
{
public string Contents {get;set;}
public int RId {get;set;}
public int YId {get;set;}
public DateTime Time {get;set;}
public int Hours {get;set;}
public string Type { get; set; }
}
public class InfoAddDAL
{ public bool Add(string name)
{
bool falg = false;
string sql = "insert into ProgramInfo(pname) values('"+name+"')";
int num=SQLHelper.ExecuteNonQuery(sql);
if(num==)
{
falg= true;
}
return falg;
} public DataTable SelectInfo()
{
List<string> list = new List<string>(); try
{
string sql = "select pname from ProgramInfo";
DataTable table=SQLHelper.ExecuteDataTable(sql);
return table; }
catch (SqlException ex)
{ throw ex;
}
catch(Exception ex)
{
throw ex;
}
} public bool DeleteInfo(string name)
{
bool falg = false;
try
{
string sql = "delete ProgramInfo where pname='" + name + "'";
int num=SQLHelper.ExecuteNonQuery(sql);
if (num == )
{
falg= true;
}
return falg;
}
catch (SqlException ex)
{ throw ex;
}
catch(Exception ex)
{
throw ex; } } public bool UpdateInfo(string name,string names)
{
bool falg = false;
string sql = "Update ProgramInfo set pname='"+name+"'where pname='"+names+"'";
int num=SQLHelper.ExecuteNonQuery(sql);
if(num==)
{
falg= true;
}
return falg;
}
}
接下来是一个辅助类,因为以后要经常用,有能力的自己写一个工具吧!
public static class SQLHelper
{
//用静态的方法调用的时候不用创建SQLHelper的实例
//Execetenonquery
// public static string Constr = "server=HAPPYPIG\\SQLMODEL;database=shooltest;uid=sa;pwd=6375196;";
public static string Constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
public static int id;
/// <summary>
/// 执行NonQuery命令
/// </summary>
/// <param name="cmdTxt"></param>
/// <param name="parames"></param>
/// <returns></returns>
public static int ExecuteNonQuery(string cmdTxt, params SqlParameter[] parames)
{
return ExecuteNonQuery(cmdTxt, CommandType.Text, parames);
}
//可以使用存储过程的ExecuteNonquery
public static int ExecuteNonQuery(string cmdTxt, CommandType cmdtype, params SqlParameter[] parames)
{
//判断脚本是否为空 ,直接返回0
if (string.IsNullOrEmpty(cmdTxt))
{
return ;
}
using (SqlConnection con = new SqlConnection(Constr))
{
using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
{
if (parames != null)
{
cmd.CommandType = cmdtype;
cmd.Parameters.AddRange(parames);
}
con.Open();
return cmd.ExecuteNonQuery();
}
}
}
public static SqlDataReader ExecuteDataReader(string cmdTxt, params SqlParameter[] parames)
{
return ExecuteDataReader(cmdTxt, CommandType.Text, parames);
}
//SQLDataReader存储过程方法
public static SqlDataReader ExecuteDataReader(string cmdTxt, CommandType cmdtype, params SqlParameter[] parames)
{
if (string.IsNullOrEmpty(cmdTxt))
{
return null;
}
SqlConnection con = new SqlConnection(Constr); using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
{
cmd.CommandType = cmdtype;
if (parames != null)
{ cmd.Parameters.AddRange(parames);
}
con.Open();
//把reader的行为加进来。当reader释放资源的时候,con也被一块关闭
return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
} }
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parames)
{
return ExecuteDataTable(sql, CommandType.Text, parames);
}
//调用存储过程的类,关于(ExecuteDataTable)
public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] parames)
{
if (string.IsNullOrEmpty(sql))
{
return null;
}
DataTable dt = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(sql, Constr))
{
da.SelectCommand.CommandType = cmdType;
if (parames != null)
{
da.SelectCommand.Parameters.AddRange(parames);
}
da.Fill(dt);
return dt;
}
} /// <summary>
/// ExecuteScalar
/// </summary>
/// <param name="cmdTxt">第一个参数,SQLServer语句</param>
/// <param name="parames">第二个参数,传递0个或者多个参数</param>
/// <returns></returns>
public static object ExecuteScalar(string cmdTxt, params SqlParameter[] parames)
{
return ExecuteScalar(cmdTxt, CommandType.Text, parames);
}
//可使用存储过程的ExecuteScalar
public static object ExecuteScalar(string cmdTxt, CommandType cmdtype, params SqlParameter[] parames)
{
if (string.IsNullOrEmpty(cmdTxt))
{
return null;
}
using (SqlConnection con = new SqlConnection(Constr))
{
using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
{
cmd.CommandType = cmdtype;
if (parames != null)
{
cmd.Parameters.AddRange(parames);
}
con.Open();
return cmd.ExecuteScalar();
}
} }
//调用存储过程的DBHelper类(关于ExeceutScalar,包含事务,只能处理Int类型,返回错误号)
public static object ExecuteScalar(string cmdTxt, CommandType cmdtype,SqlTransaction sqltran, params SqlParameter[] parames)
{
if (string.IsNullOrEmpty(cmdTxt))
{
return ;
}
using (SqlConnection con = new SqlConnection(Constr))
{
int sum = ;
using (SqlCommand cmd = new SqlCommand(cmdTxt, con))
{
cmd.CommandType=cmdtype;
if (parames != null)
{
cmd.Parameters.AddRange(parames);
}
con.Open();
sqltran = con.BeginTransaction();
try
{
cmd.Transaction = sqltran;
sum=Convert.ToInt32( cmd.ExecuteScalar());
sqltran.Commit();
}
catch (SqlException ex)
{
sqltran.Rollback();
}
return sum;
}
}
}
}
数据访问层:
public class TaskDAL
{
//查询信息
public DataTable Info()
{
string sql = "select Contents,YName, Time, Hours, Type from Task,Employee where Task.YId=Employee.YId";
DataTable table =SQLHelper.ExecuteDataTable(sql);
return table;
} public DataTable RSelectInfo(Task task)
{
string sql = "select Contents,YName, Time, Hours, Type from Task,Employee where Task.YId=Employee.YId and Contents='"+task.Contents+"'";
DataTable table = SQLHelper.ExecuteDataTable(sql);
return table;
}
//根据条件查询
public DataTable SelectInfo(DateTime time1, DateTime time2)
{
string sql = "select Contents,YName, Time, Hours, Type from Task,Employee where Time between'" + time1 + "' and '"+ time2 + "' and Task.YId=Employee.YId";
DataTable table = SQLHelper.ExecuteDataTable(sql);
return table;
} //加载任务名称
public DataTable RInfo()
{
string sql = "select Contents from Task ";
DataTable table = SQLHelper.ExecuteDataTable(sql); return table;
}
}
在这里再引用一个App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="constr" connectionString="data source=.; initial catalog=AddInfo; uid=sa;">
</add>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
窗体加载:
private void FrmMain_Load(object sender, EventArgs e)
{
txt02.Enabled = false;
} private void btn01_Click(object sender, EventArgs e)
{
InfoAddDAL info = new InfoAddDAL();
if (txt02.Text=="")
{
MessageBox.Show("请输入你要添加的文本");
}
else
{
try
{
bool falg = info.Add(txt02.Text);
if (falg)
{
DataTable table = info.SelectInfo();
lb01.DataSource = table;
lb01.DisplayMember = "pname";
}
txt02.Text = "";
}
catch (SqlException)
{ MessageBox.Show("sql语句错误");
}
catch (Exception)
{
MessageBox.Show("程序出错");
}
} } private void btn02_Click(object sender, EventArgs e)
{
InfoAddDAL info = new InfoAddDAL();
string name = lb01.SelectedItem.ToString();
bool falg = info.DeleteInfo(name);
if (falg)
{
DataTable table = info.SelectInfo();
lb01.DataSource = table;
lb01.DisplayMember = "pname";
} } private void lb01_DoubleClick(object sender, EventArgs e)
{ string name = lb01.SelectedItem.ToString();
txt02.Text = name;
} private void btn03_Click(object sender, EventArgs e)
{
if(txt02.Text=="")
{
MessageBox.Show("请选择要修改的文本");
}
else
{
string name = lb01.SelectedItem.ToString();
InfoAddDAL info = new InfoAddDAL();
bool falg = info.UpdateInfo(txt02.Text, name);
if (falg)
{
DataTable table = info.SelectInfo();
lb01.DataSource = table;
lb01.DisplayMember = "pname";
}
txt02.Text = "";
} } private void btn04_Click(object sender, EventArgs e)
{
txt02.Enabled = true;
InfoAddDAL info = new InfoAddDAL();
try
{
DataTable table = info.SelectInfo();
lb01.DataSource = table;
lb01.DisplayMember = "pname";
}
catch (SqlException)
{ MessageBox.Show("sql语句错误");
}
catch (Exception)
{
MessageBox.Show("程序出错");
} }
}
TaskDAL DAL = new TaskDAL();
DataTable table = null; private void btn01_Click(object sender, EventArgs e)
{ DateTime time1 = dateTimePicker1.Value;
DateTime time2 = dtp02.Value;
if (cbo01.Text == "")
{
table = DAL.Info();
}
else if(time1.ToString() != "" && time2.ToString() != "")
{
table = DAL.SelectInfo(time1, time2);
}
else if(cbo01.Text!=""&& time1.ToString() != "" && time2.ToString() != "")
{
Task task = new Task();
task.Contents = cbo01.SelectedText.ToString();
table = DAL.RSelectInfo(task);
}
dgvList.DataSource = table;
} private void FrmTwo_Load(object sender, EventArgs e)
{
table= DAL.RInfo();
cbo01.DisplayMember = "Contents";
cbo01.DataSource = table;
}
配置文件里保存的是应用程序运行所依赖的常量,这些常量可能会随着多种因素的变化而变化,所以将这些信息写在配置文件中,由程序来动态读取。
读取连接字符串的语法如下:
public static readonly string conString=ConfigurationManager.ConnectionStrings["MySchoolConnectionString"].ToString();
(2)const和readonly的区别
(1)readonly只能修饰类变量 const修饰成员变量和局部变量
(2)readonly在运行时赋值,const在编译时赋值
(3)const只能修饰值类型和特殊的引用类型 readonly可以修饰任何类型
第三章 提高系统性能:从数据访问开始
(1)using语句
using的作用:(1)导入命名空间(2)释放实现了disposable接口的对象非托管资源
语法:
using(SqlConnection con=new SqlConnection(constr))
{
//数据库操作代码.......
}
(2)参数化命令(防止SQL注入攻击)
语法:
()使用参数名和参数类型进行设置 public SqlParameter Add(string parameterName,SqlDbType slDbType); public SqlParameter Add(string parameterName,SqlDbType paraValue,int size); ()使用SqlParameter对象进行填充 public SqlParameter Add(SqlParameter value); //添加单个参数 public void AddRange(SqlParameter[] values); //添加多个参数
(3)SqlParameter类的常用属性
DbType :获取或设置参数的DbType Direction :获取或设置一个值,该值表示参数是只可输入,是可输出,还是双向存储过程返回值参数 IsNullable :获取或设置一个值,该值指示参数是否接受空值 ParameterName :获取或设置SqlParameter的名称 Size :获取或设置列中数据的最大值(以字节为单位) SqlDbType :获取或设置参数的SqlDbType Value :获取或设置该参数的值
第四章 业务的扩展:三层架构
(1)业务逻辑层BLL(Business Logic Layer)
实体类:
public class Grade
{
public int GradeId { get; set; }
public string GradeName { get;set;} }
public class Result
{
public int StudentNo { get; set; }
public int SubjectId { get; set; }
public int StudentResult { get; set; }
public string ExamDate { get; set; }
public int Id { get; set; }
}
public class Student
{
public int StudentNo { get; set; }
public string StudentName { get; set; }
public string LoginPwd { get; set; }
public int GradeId { get; set; }
public string Gender { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
public DateTime Birthday { get; set; }
public string Email { get; set; }
public string IdentityId { get; set; }
}
public class Subject
{
public int SubjectId { get; set; }
public string SubjectName { get; set; }
public int ClassHour { get; set; }
public int GradeId { get; set; }
}
数据访问层DAL:
/// <summary>
/// 班级表
/// </summary>
public class GradeDAL
{
//加载班级信息
public DataTable GradeInfo()
{
string sql = "select * from Grade";
DataTable table=SQLHelper.ExecuteDataTable(sql);
return table;
}
}
public class MyTool
{
/// <summary>
/// DataSetToList
/// </summary>
/// <typeparam name="T">转换类型</typeparam>
/// <param name="dataSet">数据源</param>
/// <param name="tableIndex">需要转换表的索引</param>
/// <returns></returns>
public List<T> DataTableToList<T>(DataTable dt)
{
//确认参数有效
if (dt == null )
return null;
List<T> list = new List<T>(); for (int i = ; i < dt.Rows.Count; i++)
{
//创建泛型对象
T _t = Activator.CreateInstance<T>();
//获取对象所有属性
PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
for (int j = ; j < dt.Columns.Count; j++)
{
foreach (PropertyInfo info in propertyInfo)
{
//属性名称和列名相同时赋值
if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
{
if (dt.Rows[i][j] != DBNull.Value)
{
info.SetValue(_t, dt.Rows[i][j], null);
}
else
{
info.SetValue(_t, null, null);
}
break;
}
}
}
list.Add(_t);
}
return list;
}
}
/// <summary>
/// 成绩表
/// </summary>
public class ResultDAL
{
//根据科目条件查询成绩
public DataTable SelectResult(int subjectid)
{
string sql = "select StudentName,SubjectName,StudentResult,ExamDate,student.studentno from student,subject,result where Subject.subjectid=result.subjectid and student.StudentNo=Result.StudentNo and result.subjectid="+subjectid+" ";
DataTable table = SQLHelper.ExecuteDataTable(sql);
return table;
}
//根据姓名查询成绩
public DataTable SelectResult(string studentname)
{
string sql = "select StudentName,SubjectName,StudentResult,ExamDate,student.studentno from student,subject,result where student.studentName like'%" + studentname + "%' and Subject.subjectid=result.subjectid and student.StudentNo=Result.StudentNo ";
DataTable table= SQLHelper.ExecuteDataTable(sql);
return table;
}
//查询全部成绩
public DataTable SelectResult()
{
string sql = "select StudentName,SubjectName,StudentResult,ExamDate,student.studentno from student,subject,result where Subject.subjectid=result.subjectid and student.StudentNo=Result.StudentNo ";
DataTable table = SQLHelper.ExecuteDataTable(sql);
return table;
}
// 修改学生成绩
public bool UpdateResult(Result result)
{
bool flag = false;
string sql = "update Result set StudentResult='" + result.StudentResult+ "',ExamDate='"+result.ExamDate+ "',SubjectId='"+result.SubjectId+"' where result.studentno="+result.StudentNo+"";
int count= SQLHelper.ExecuteNonQuery(sql);
if(count>)
{
flag = true;
}
return flag;
}
//添加学生成绩
public bool AddResult(Result result)
{
bool flag = false;
string sql = "insert into result values(@studentno,@subjectid,@studentresult,@examdate)";
SqlParameter[] para =
{
new SqlParameter("@studentno",result.StudentNo),
new SqlParameter("@subjectid",result.SubjectId),
new SqlParameter("@studentresult",result.StudentResult),
new SqlParameter("@examdate",result.ExamDate)
};
int num=Convert.ToInt32(SQLHelper.ExecuteScalar(sql,para));
if(num>)
{
flag = true;
}
return flag;
}
}
/// <summary>
/// 学生表
/// </summary>
public class StudentDAL
{
//Login登录
public bool IsLogin(Student stu)
{
#region 方式一:登录
//bool flag = false;
//string sql = "select count(1) from student where studentno=" + stu.StudentNo + " and Loginpwd='" + stu.LoginPwd + "'";
//int count = Convert.ToInt32(SQLHelper.ExecuteScalar(sql));
//if (count > 0)
//{
// flag = true;
//}
//return flag;
#endregion
#region 方式二:登录
bool flag = false;
string sql = "select count(1) from student where studentno=@studentno and loginpwd=@pwd";
SqlParameter[] para =
{
new SqlParameter("@studentno",stu.StudentNo),
new SqlParameter("@pwd",stu.LoginPwd)
};
int count = Convert.ToInt32(SQLHelper.ExecuteScalar(sql, para));
if (count > )
{
flag = true;
}
return flag;
#endregion
}
//根据条件学生信息
// StudentNo, LoginPwd, StudentName, Gender, GradeId, Phone, Address, Birthday, Email,
public List<Student> StudentInfo(int gradeid)
{
#region 查询一
List<Student> list = new List<Student>();
string sql = "select StudentNo, LoginPwd, StudentName, Gender, GradeId, Phone, Address, Birthday, Email,IdentityId from student where GradeId=" + gradeid + "";
SqlDataReader dr = SQLHelper.ExecuteDataReader(sql);
if (dr.HasRows)
{
while (dr.Read())
{
Student stu = new Student();
stu.StudentNo = Convert.ToInt32(dr["StudentNo"]);
stu.LoginPwd = dr["LoginPwd"].ToString();
stu.StudentName = dr["StudentName"].ToString();
stu.Gender = dr["Gender"].ToString();
stu.GradeId = Convert.ToInt32(dr["GradeId"]);
stu.Phone = dr["Phone"].ToString();
stu.Address = dr["Address"].ToString();
stu.Birthday = Convert.ToDateTime(dr["Birthday"]);
stu.Email = dr["Email"].ToString();
stu.IdentityId = dr["IdentityId"].ToString();
list.Add(stu);
}
}
dr.Close();
return list;
#endregion }
public List<Student> StudentInfo(string name)
{
#region 查询一
List<Student> list = new List<Student>();
string sql = "select StudentNo, LoginPwd, StudentName, Gender, GradeId, Phone, Address, Birthday, Email,IdentityId from student where StudentName=" + name + "";
SqlDataReader dr = SQLHelper.ExecuteDataReader(sql);
if (dr.HasRows)
{
while (dr.Read())
{
Student stu = new Student();
stu.StudentNo = Convert.ToInt32(dr["StudentNo"]);
stu.LoginPwd = dr["LoginPwd"].ToString();
stu.StudentName = dr["StudentName"].ToString();
stu.Gender = dr["Gender"].ToString();
stu.GradeId = Convert.ToInt32(dr["GradeId"]);
stu.Phone = dr["Phone"].ToString();
stu.Address = dr["Address"].ToString();
stu.Birthday = Convert.ToDateTime(dr["Birthday"]);
stu.Email = dr["Email"].ToString();
stu.IdentityId = dr["IdentityId"].ToString();
list.Add(stu);
}
}
dr.Close();
return list;
#endregion }
// 添加学生信息
public int StudentAdd(Student stu)
{ string sql = "insert into student values('" + stu.LoginPwd + "','" + stu.StudentName + "'," + stu.Gender + ",'" + stu.GradeId + "','" + stu.Phone + "','" + stu.Address + "','" + stu.Birthday + "','" + stu.Email + "','"+stu.IdentityId+"');select @@IDENTITY"; int num = Convert.ToInt32(SQLHelper.ExecuteScalar(sql)); return num; }
//修改学生信息
public bool UpdateInfo(Student stu)
{
bool flag = false;
string str = "data source=.; initial catalog=MySchool; uid=sa;";
using (SqlConnection con = new SqlConnection(str))
{
SqlCommand com = con.CreateCommand();
com.CommandText = "usp_Update";
com.CommandType = CommandType.StoredProcedure;
SqlParameter[] para =
{
new SqlParameter("@studentno",stu.StudentNo),
new SqlParameter("@pwd",stu.LoginPwd),
new SqlParameter("@name",stu.StudentName),
new SqlParameter("@gender",stu.Gender),
new SqlParameter("@gradeid",stu.GradeId),
new SqlParameter("@phone",stu.Phone),
new SqlParameter("@address",stu.Address),
new SqlParameter("@birthday",stu.Birthday),
new SqlParameter("@email",stu.Email),
new SqlParameter("@identitycard",stu.IdentityId)
};
com.Parameters.AddRange(para);
con.Open();
int count = com.ExecuteNonQuery();
if (count > )
{
flag = true;
}
return flag;
} }
//查询全部学生信息
public DataTable Student()
{
string sql = "select StudentNo, LoginPwd, StudentName, Gender, GradeName, Phone, Address, Birthday, Email,IdentityCard from student,grade where student.gradeid=grade.gradeid";
DataTable table = SQLHelper.ExecuteDataTable(sql);
return table;
}
//条件查询学生信息
public DataTable Student(string name)
{
string sql = "select StudentNo, LoginPwd, StudentName, Gender, GradeId, Phone, Address, Birthday, Email,IdentityCard from student,grade where gradename=@name and student.gradeid=grade.gradeid";
SqlParameter para = new SqlParameter("@name", name);
DataTable table = SQLHelper.ExecuteDataTable(sql, para);
return table;
}
public DataTable SelectStudent(string gradename,string grader)
{
string sql = "select StudentNo, LoginPwd, StudentName, Gender,student.Gradeid, Phone, Address, Birthday, Email,IdentityCard from student,grade where student.gradeid=grade.gradeid and gradename=@name and gender=@gender";
SqlParameter[] para =
{
new SqlParameter("@name",gradename),
new SqlParameter("@gender",grader)
};
DataTable table = SQLHelper.ExecuteDataTable(sql, para);
return table;
}
public DataTable SelectStudent(string gradename)
{
string sql = "select StudentNo, LoginPwd, StudentName, Gender,student.GradeId, Phone, Address, Birthday, Email,IdentityCard from student,grade where student.gradeid=grade.gradeid and gradename=@name";
SqlParameter para = new SqlParameter("@name",gradename);
DataTable table = SQLHelper.ExecuteDataTable(sql, para);
return table;
}
}
/// <summary>
/// 科目表
/// </summary>
public class SubjectDAL
{
public DataTable SubjectInfo()
{
string sql = "select * from subject";
DataTable table = SQLHelper.ExecuteDataTable(sql);
return table;
} public List<Subject> SubjectALL(int gradeid)
{
string sql = "select * from subject where gradeid=@gradeid";
SqlParameter para = new SqlParameter("@gradeid",gradeid);
DataTable table = SQLHelper.ExecuteDataTable(sql,para);
MyTool tool = new MyTool();
List<Subject> list=tool.DataTableToList<Subject>(table);
return list;
}
}
业务逻辑层BLL:
public class GradeBLL
{
GradeDAL dal = new GradeDAL();
//加载年级信息
public DataTable GradeInfo()
{
return dal.GradeInfo();
}
}
public class ResultBLL
{
ResultDAL dal = new ResultDAL();
public DataTable SelectResult(int subjectid)
{
return dal.SelectResult(subjectid);
}
//条件查询
public DataTable SelectResult(string studentname)
{
return dal.SelectResult(studentname);
}
//查询全部
public DataTable SelectResult()
{
return dal.SelectResult();
}
//修改成绩
public bool UpdateResult(Result result)
{
return dal.UpdateResult(result);
}
//添加学生成绩
public bool AddResult(Result result)
{
return dal.AddResult(result);
} }
/// <summary>
/// 逻辑层
/// </summary>
/// public class StudentBLL
{
StudentDAL dal = new StudentDAL();
//登录
public bool IsLogin(Student stu)
{
//Common com = new Common();
//string temp = com.GetMD5String(stu.LoginPwd);
//stu.LoginPwd = temp;
return dal.IsLogin(stu);
}
////显示学生信息
public List<Student> StudentInfo(int gradeid)
{
return dal.StudentInfo(gradeid);
} public List<Student> StudentInfo(string name)
{
return dal.StudentInfo(name);
}
//增加学生信息
public int StudentAdd(Student stu)
{
//Common com = new Common();
//string temp = com.GetMD5String(stu.LoginPwd);
//stu.LoginPwd = temp;
return dal.StudentAdd(stu);
}
public bool UpdateInfo(Student stu)
{
return dal.UpdateInfo(stu);
} public DataTable SelectStudent(string gradename,string grader )
{
return dal.SelectStudent(gradename, grader);
} public DataTable SelectStudent(string gradename)
{
return dal.SelectStudent(gradename);
} public DataTable Student()
{
return dal.Student();
}
}
public class SubjectBLL
{
//加载科目信息
SubjectDAL sdl = new SubjectDAL();
public DataTable SubjectInfo()
{
return sdl.SubjectInfo();
} public List<Subject> SubjectALL(int gradeid)
{
return sdl.SubjectALL(gradeid);
}
}
表示层DAL:
登录窗体:
public partial class FrmIsLogin : Form
{
public FrmIsLogin()
{
InitializeComponent();
}
StudentBLL bll = new StudentBLL();
private void btn01_Click(object sender, EventArgs e)
{
Student stu = new Student();
stu.StudentNo = Convert.ToInt32(txt01.Text);
stu.LoginPwd = txt02.Text;
bool flag= bll.IsLogin(stu);
if(flag)
{
FrmMain mm = new FrmMain();
Hide();
mm.Show();
// MessageBox.Show("Test");
}
}
}
主窗体:
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
} private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
FrmAdd aa = new FrmAdd();
aa.MdiParent = this;
aa.Show();
} private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
FrmInfo info = new FrmInfo();
info.MdiParent = this;
info.Show();
} private void 添加学生成绩ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmResult result = new FrmResult();
result.MdiParent = this;
result.Show();
} private void 查询学生成绩ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmSelectResult sr = new FrmSelectResult();
sr.MdiParent = this;
sr.Show();
} private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
添加和修改学生信息窗体:
public partial class FrmAdd : Form
{
public FrmAdd()
{
InitializeComponent();
}
public int no;
public string pwd;
public string name;
public string phone;
public string address;
public string gender;
public string gradename;
public string email;
public string birthday;
public string identitycard; StudentBLL bll = new StudentBLL();
//添加学生
private void btn01_Click(object sender, EventArgs e)
{
//创建一个学生对象
Student stu = new Student();
stu.LoginPwd = txt02.Text;
stu.StudentName = txt04.Text;
stu.Gender = rb02.Checked ? "" : "";
stu.Phone = txt05.Text;
stu.Address = txt06.Text;
stu.Birthday = Convert.ToDateTime(txt09.Text);
stu.Email = txt07.Text;
stu.GradeId = Convert.ToInt32(cbo01.SelectedValue);
stu.IdentityId = txt08.Text;
//把对象添加到数据表中 if(txt01.Text!="")
{ stu.StudentNo = Convert.ToInt32(txt01.Text);
bool flag = bll.UpdateInfo(stu);
if (flag)
{
MessageBox.Show("修改成功!");
foreach (Control item in gb01.Controls)
{
if (item is TextBox)
{
item.Text = "";
} }
foreach (Control item in gb02.Controls)
{
if (item is TextBox)
{
item.Text = "";
}
rb01.Checked = true;
cbo01.Text = "";
}
} }
else
{
int result = bll.StudentAdd(stu);
if (result>)
{
txt01.Text = result.ToString();
MessageBox.Show("添加成功!");
foreach (Control item in gb01.Controls)
{
if (item is TextBox)
{
item.Text = "";
} }
foreach (Control item in gb02.Controls)
{
if (item is TextBox)
{
item.Text = "";
}
rb01.Checked = true;
cbo01.Text = "";
}
}
}
} GradeBLL gbl = new GradeBLL();
//加载班级信息
private void FrmAdd_Load(object sender, EventArgs e)
{
cbo01.ValueMember = "GradeId";
cbo01.DisplayMember = "gradeName";
cbo01.DataSource= gbl.GradeInfo();
if (this.Text == "添加学生信息")
{
btn01.Text = "添加";
}
else
{
btn01.Text = "修改";
txt01.Text = no.ToString();
txt02.Text = pwd;
txt03.Text = pwd;
txt04.Text = name;
if (gender.Equals())
{
rb01.Checked = true;
}
else
{
rb02.Checked = true;
}
txt05.Text = phone;
txt06.Text = address;
txt09.Text = birthday.ToString();
txt07.Text = email;
cbo01.Text = gradename;
txt08.Text = identitycard;
} }
}
树状显示学生信息:
public partial class FrmInfo : Form
{
public FrmInfo()
{
InitializeComponent();
}
StudentBLL sbl = new StudentBLL();
GradeBLL bll = new GradeBLL();
private void FrmInfo_Load(object sender, EventArgs e)
{
TreeNode tn= new TreeNode("全部");
DataTable table=bll.GradeInfo();
foreach (DataRow item in table.Rows)
{
TreeNode node = new TreeNode();
node.Text = item["gradename"].ToString();
TreeNode child = new TreeNode();
child.Text = "男";
child.Tag = "";
TreeNode childs = new TreeNode();
childs.Text = "女";
childs.Tag = "";
node.Nodes.Add(child);
node.Nodes.Add(childs);
//node.Nodes.Add("男");
//node.Nodes.Add("女");
tn.Nodes.Add(node);
}
tvList.Nodes.Add(tn); } private void tvList_AfterSelect(object sender, TreeViewEventArgs e)
{
if(tvList.SelectedNode.Level==)
{
dgvList.DataSource = sbl.Student();
}
else if(tvList.SelectedNode.Level==)
{
dgvList.DataSource=sbl.SelectStudent(tvList.SelectedNode.Text);
}else if(tvList.SelectedNode.Level == )
{
if(tvList.SelectedNode.Text=="男")
{
dgvList.DataSource = sbl.SelectStudent(tvList.SelectedNode.Parent.Text, Convert.ToString(tvList.SelectedNode.Tag));
}
else
{
dgvList.DataSource = sbl.SelectStudent(tvList.SelectedNode.Parent.Text, Convert.ToString(tvList.SelectedNode.Tag));
} } } private void 修改ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmAdd add = new FrmAdd();
add.Text = "修改学生成绩";
add.no = Convert.ToInt32(dgvList.SelectedRows[].Cells[].Value);
add.pwd = dgvList.SelectedRows[].Cells[].Value.ToString();
add.name = dgvList.SelectedRows[].Cells[].Value.ToString();
add.gender = dgvList.SelectedRows[].Cells[].Value.ToString();
add.gradename = dgvList.SelectedRows[].Cells[].Value.ToString();
add.phone = dgvList.SelectedRows[].Cells[].Value.ToString();
add.address = dgvList.SelectedRows[].Cells[].Value.ToString();
add.birthday= (dgvList.SelectedRows[].Cells[].Value.ToString());
add.email = dgvList.SelectedRows[].Cells[].Value.ToString();
add.identitycard = dgvList.SelectedRows[].Cells[].Value.ToString();
add.Show();
} private void 取消ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmResult fr = new FrmResult();
fr.no = Convert.ToInt32(dgvList.SelectedRows[].Cells[].Value);
fr.name = dgvList.SelectedRows[].Cells[].Value.ToString();
fr.Show();
}
}
添加学生成绩窗体:
public partial class FrmResult : Form
{
public FrmResult()
{
InitializeComponent();
}
GradeBLL bll = new GradeBLL();
SubjectBLL sbl = new SubjectBLL();
ResultBLL rbl = new ResultBLL();
private void FrmResult_Load(object sender, EventArgs e)
{
cbosubject.ValueMember = "subjectid";
cbosubject.DisplayMember = "subjectname";
cbosubject.DataSource = sbl.SubjectInfo();
txtname.Text = name;
}
public int no;
public string name;
private void btnAdd_Click(object sender, EventArgs e)
{
Result rt = new Result();
rt.StudentNo = no;
rt.SubjectId=Convert.ToInt32(cbosubject.SelectedValue);
rt.StudentResult = Convert.ToInt32(txtresult.Text);
rt.ExamDate = txttime.Text;
bool flag=rbl.AddResult(rt);
if(flag)
{
MessageBox.Show("添加成功!");
}
}
}
ComboBox联动:
public partial class FrmScore : Form
{
public FrmScore()
{
InitializeComponent();
}
SubjectBLL bll = new SubjectBLL();
GradeBLL gbl = new GradeBLL();
private void cbograde_SelectedIndexChanged(object sender, EventArgs e)
{
int gradeid = Convert.ToInt32(cbograde.SelectedValue);
cbosubject.ValueMember = "subjectid";
cbosubject.DisplayMember = "subjectname";
cbosubject.DataSource = bll.SubjectALL(gradeid);
} private void FrmScore_Load(object sender, EventArgs e)
{
cbograde.ValueMember = "gradeid";
cbograde.DisplayMember = "gradename";
cbograde.DataSource= gbl.GradeInfo();
}
}
根据科目和年级查询和修改学生成绩窗体:
public partial class FrmSelectResult : Form
{
public FrmSelectResult()
{
InitializeComponent();
}
GradeBLL bll = new GradeBLL();
SubjectBLL sbl = new SubjectBLL();
ResultBLL rbl = new ResultBLL();
private void FrmSelectResult_Load(object sender, EventArgs e)
{
cbo01.ValueMember = "gradeid";
cbo01.DisplayMember = "gradename";
cbo01.DataSource = bll.GradeInfo(); cbo02.ValueMember = "subjectid";
cbo02.DisplayMember = "subjectname";
cbo02.DataSource = sbl.SubjectInfo(); cbo03.ValueMember = "subjectid";
cbo03.DisplayMember = "subjectname";
cbo03.DataSource = sbl.SubjectInfo(); DataTable table = rbl.SelectResult();
dgvList.DataSource = table;
}
DataTable table;
private void button1_Click(object sender, EventArgs e)
{
if(txt01.Text=="")
{
table = rbl.SelectResult(Convert.ToInt32(cbo02.SelectedValue));
}
else
{
table = rbl.SelectResult(txt01.Text);
} dgvList.DataSource = table;
} private void dgvList_DoubleClick(object sender, EventArgs e)
{
lbl01.Text = dgvList.SelectedRows[].Cells[].Value.ToString();
cbo03.Text = dgvList.SelectedRows[].Cells[].Value.ToString();
txt02.Text = dgvList.SelectedRows[].Cells[].Value.ToString();
txt03.Text = dgvList.SelectedRows[].Cells[].Value.ToString();
} private void button2_Click(object sender, EventArgs e)
{
Result result = new Result();
result.StudentNo = Convert.ToInt32(dgvList.SelectedRows[].Cells[].Value);
result.StudentResult = Convert.ToInt32(txt02.Text);
result.SubjectId = Convert.ToInt32(cbo03.SelectedValue);
result.ExamDate = txt03.Text;
bool flag= rbl.UpdateResult(result);
if(flag)
{
MessageBox.Show("修改成功");
DataTable table = rbl.SelectResult();
dgvList.DataSource = table;
}
} private void cbo01_SelectedIndexChanged(object sender, EventArgs e)
{
int gradeid = Convert.ToInt32(cbo01.SelectedValue);
cbo02.ValueMember = "subjectid";
cbo02.DisplayMember = "subjectname";
cbo02.DataSource = sbl.SubjectALL(gradeid);
}
}
这个需要你自己多练习,现在学习是在学习思想,记得没事多练习.......
C#深入.NET平台的软件系统分层开发的更多相关文章
- 深入.NET平台的软件系统分成开发(1/6)
第一章软件系统的分层开发 1.1 分成架构 分成模式定义:将解决方案中功能不同的模块分到不同的项目中实现.每一层中的主键应保持内聚性,每一层都应与他下面的各层保持松耦合. 分层模式是最常见的一种架构模 ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- 基于微软平台IIS/ASP.NET开发的大型网站有哪些呢?
首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/JAVA平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...
- java分层开发
既然是分层开发,首先我们需要知道的是分为那几个层,并且是干什么的? 1.实体层(entity) 对应数据库中的一张表,有了它可以降低耦合性,同时也是数据的载体. 2.数据访问对象(data acces ...
- java的分层开发
既然是分层开发,首先我们需要知道的是分为那几个层,并且是干什么的? 1.实体层(entity) 对应数据库中的一张表,有了它可以降低耦合性,同时也是数据的载体. 2.数据访问对象(data acces ...
- SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework
2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...
- 微信公众平台自定义菜单PHP开发
微信公众平台自定义菜单PHP开发,微信公众平台自定义菜单是如何实现的呢?其实很简单,首先在微信公众平台升级为服务号,获取appid和appsecret,然后根据这2个参数获取access_token, ...
- 用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发
快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs20 ...
- 大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建
大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建 大数据应用之Windows平台Hbase客户端Eclipse环境搭建-Java版 作者:张子良 版权所有,转载请注明出处 引子 ...
随机推荐
- Sensor(LIGHT)
package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...
- mongodb(mongoose-redis-cache)
在传统的项目中,我们经常会用到缓存来优化数据库的读取,比如java中,我们利用spring的AOP能力,在读写数据库前增加对缓存的操作. 在node与mongodb的项目中也仍然会存在类似问题,本文参 ...
- 《C#图解教程》读书笔记之六:接口和转换
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.接口那点事儿 (1)什么是接口? 一组函数成员而未实现的引用类型.只有类和结构能实现接口. (2)从ICom ...
- VS2012下配置MPI
并行处理结课实验,要用到MPI编程,我的电脑和VS2012都是64位的,以为MPICH也得是64位才行,结果饶了很大的弯——配置正确,添加引用之后,仍然无法识别MPI函数. 后来换了个32位的MPIC ...
- 如何将Icon转成Bitmap
最近工作中有个需求是将Icon转成带Alpha通道的Bitmap, 虽然网上有不少这方面的文章,但很多都是错的, 这里记录下,或许对后来人有用. 要实现这个功能,我们首先需要理解Icon的格式,我们可 ...
- 谈谈c#中异步编程模型的变迁
大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. Beg ...
- PHP面向对象之魔术方法复习
魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 ...
- piap.windows io 监测attilax总结
piap.windows io 监测attilax总结 当硬盘光狂闪的时候. 主要目标:找出哪个进程占用io最多, 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来 ...
- Storm 实战:构建大数据实时计算
Storm 实战:构建大数据实时计算(阿里巴巴集团技术丛书,大数据丛书.大型互联网公司大数据实时处理干货分享!来自淘宝一线技术团队的丰富实践,快速掌握Storm技术精髓!) 阿里巴巴集团数据平台事业部 ...
- Java项目——模拟电话薄联系人增删改查
该项目模拟了电话本记录联系人的业务功能,用来练习对数据库的增删改查等操作. 菜单类:Menu -- 用来封装主菜单和个选项的子菜单 Person类: Person--联系人的实体类 TelNoteRe ...