No.1实现登陆功能,验证用户名和密码。从数据库里进行匹配,看是否有符合要求的数据。

在DAL层编写代码,返回值为布尔类型。方法参数为(student实体类对象),使用参数化SqlParameter类型防止SQL注入。

 1 public bool IsLogin(Student stu)
2 {
3 bool flag = false;
4 SqlConnection con = new SqlConnection(SqlHelper.str);
5
6 string sql = "select count(1) from student where studentNo=@StudentName and LoginPwd=@LoginPwd";
7 //02 将sql语句交给SQL服务器执行
8 SqlParameter para1 = new SqlParameter("@StudentName", stu.StudentNo);
9 SqlParameter para2 = new SqlParameter("@LoginPwd", stu.LoginPwd);
10 SqlCommand cmd = new SqlCommand(sql,con);
11 cmd.Parameters.Add(para1);
12 cmd.Parameters.Add(para2);
13 try
14 {
15 con.Open();
16 int count = Convert.ToInt32(cmd.ExecuteScalar());
17 if (count > 0)
18 {
19 flag = true;
20 }
21 }
22 catch (Exception ex)
23 {
24
25 throw ex;
26 }
27 finally
28 {
29 con.Close();
30 }
31 return flag;
32 }

在BLL层创建DAL层的对象,调用DAL层的login方法,返回值和参数和DAL层login方法一致,return dal.login(stu)

1  public bool IsLogin(Student stu)
2 {
3 return dal.IsLogin(stu);
4 }

在UI层调用BLL层的方法,并在UI层创建实体类对象,给实体类对象的属性赋值后将对象放入调用的BLL层的方法中。判断登陆是否成功!

 1 StudentBLL bll = new StudentBLL();
2 Student stu = new Student();
3 stu.StudentNo = Convert.ToInt32(txtName.Text);
4 stu.LoginPwd = txtPwd.Text;
5 bool flag = bll.IsLogin(stu);
6 if (flag)
7 {
8 MessageBox.Show("登陆成功");
9 frmlist list = new frmlist();
10 list.Show();
11 }
12 else
13 {
14 MessageBox.Show("登陆失败");
15 }

No.2展示学生信息

在DAL层编写方法返回值是泛型集合,无方法参数,使用工具类(SqlHelper类)将DataTable类型转换为泛型

 1  public List<Student> Select()
2 {
3 SqlConnection con = new SqlConnection(SqlHelper.str);
4 string sql = "select * from student";
5 DataTable dt = SqlHelper.ExecuteDataTable(sql);
6 My_Tool tool = new My_Tool();
7 List<Student> list = tool.DataTableToList<Student>(dt);
8 return list;
9
10 }

在BLL层编写方法与DAL层同理

1  public List<Student> Select()
2 {
3 return dal.Select();
4 }

在UI层的初始化Select方法()将数据绑定到datagridView中!

 1  private void frmlist_Load(object sender, EventArgs e)
2 {
3 Initial();
4 }
5 public List<Student> list = new List<Student>();
6 public void Initial()
7 {
8 StudentBLL bll = new StudentBLL();
9 list= bll.Select();
10 this.dgvlist.DataSource = list;
11
12 }

No.3实现添加学生信息

Insert语句插入数据的参数较多,所以我们可以声明一个SqlParaMeters类型的数组,节约代码,方法返回值依然是bool类型,方法参数是Student类型的对象。注意!在给Command对象添加参数的时候

要使用AddRange()方法!

 1  public bool Insert(Student stu)
2 {
3 bool flag = false;
4 SqlConnection con = new SqlConnection(SqlHelper.str);
5 string sql = "insert into student values(@LoginPwd,@StudentName,@Gender,@GradeId,@Phone,@Address,@Birthday,@Email,@MyTT)";
6 SqlParameter[] para =
7 {
8 new SqlParameter("@LoginPwd", stu.LoginPwd),
9 new SqlParameter("@StudentName", stu.StudentName),
10 new SqlParameter("@Gender", stu.Gender),
11 new SqlParameter("@GradeId", stu.GradeId),
12 new SqlParameter("@Phone", stu.Phone),
13 new SqlParameter("@Address", stu.Address),
14 new SqlParameter("@Birthday", stu.Birthday),
15 new SqlParameter("@Email", stu.Email),
16 new SqlParameter("@MyTT", stu.MyTT)
17 };
18 SqlCommand cmd = new SqlCommand(sql,con);
19 cmd.Parameters.AddRange(para);
20
21 try
22 {
23 con.Open();
24 int count = Convert.ToInt32(cmd.ExecuteScalar());
25 if (count > 0)
26 {
27 flag = true;
28 }
29
30 }
31 catch (Exception ex)
32 {
33
34 throw ex;
35 }
36 finally
37 {
38 con.Close();
39 }
40 return flag;
41 }

在BLL层同样实现了方法调用!

1  public bool Insert(Student stu)
2 {
3 return dal.Insert(stu);
4 }

在UI层调用BLL层的方法,给Student类的属性赋值,判断是否添加学生信息成功!

 1 StudentBLL bll = new StudentBLL();
2 Student stu = new Student();
3
4 stu.LoginPwd = txtPwd.Text;
5 stu.StudentName = txtName.Text;
6 if (rbtnFemale.Checked)
7 {
8 stu.Gender = "0";
9 }
10 else if (rbtnMan.Checked)
11 {
12 stu.Gender = "1";
13 }
14 if (cboGrade.SelectedItem.ToString() == "S1")
15 {
16 stu.GradeId = 0;
17 }
18 else if (cboGrade.SelectedItem.ToString() == "S2")
19 {
20 stu.GradeId = 1;
21 }
22 stu.Phone = txtPhone.Text;
23 stu.Address = txtAddress.Text;
24 stu.Birthday = dpBirthday.Value;
25 stu.Email = txtEmail.Text;
26 this.listnew.Add(stu);
27 bool flag= bll.Insert(stu);
28 frm.dgvlist.DataSource = new BindingList<Student>(this.listnew);
29 this.Close();

No.4实现comboBox的两级联动,当选中下拉框中的一项时,另一个下拉框会自动匹配,并且以筛选条件来查询!

在GradeDAL层编写读取所有年级下拉框的方法,返回值为泛型集合,无方法参数

 1  public List<Grade> GetGradenew()
2 {
3 List<Grade> list = new List<Grade>();
4 using (SqlConnection con = new SqlConnection(SqlHelper.str))
5 {
6 string sql = "select * from Grade";
7 SqlCommand cmd = new SqlCommand(sql,con);
8 con.Open();
9 using (SqlDataReader dr = cmd.ExecuteReader())
10 {
11 while (dr.Read())
12 {
13 Grade ga = new Grade();
14 ga.GradeId = Convert.ToInt32(dr["GradeId"]);
15 ga.GradeName = dr["GradeName"].ToString();
16 list.Add(ga);
17
18 }
19 }
20
21 }
22 return list;
23 }

在BLL层调用该方法!

1  public List<Grade> GetGradenew()
2 {
3 return dal.GetGradenew();
4 }

在UI 层中调用此方法,comboBox的disPalyMember属性为“gradename”,valuemember属性设置为“gradeid”,将comboBox的DropDownHeight属性设置为106,避免下拉框冗余

1 this.comboBox2.DropDownHeight = 106;
2 this.comboBox1.DataSource = bll.GetGradenew();
3 this.comboBox1.ValueMember = "GradeId";
4 this.comboBox1.DisplayMember = "GradeName";

在DAL层编写两个方法,返回值都是泛型,一个方法有返回值,另一个没有,一个方法是为了查询所有科目,另一个是根据年级编号查询科目

public List<Subject> GetSubjectName()
{
List<Subject> list = new List<Subject>();
using (SqlConnection con = new SqlConnection(SqlHelper.str))
{
string sql = "select * from Subject";
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Subject sub = new Subject();
sub.SubjectId = Convert.ToInt32(dr["SubjectId"]);
sub.SubjectName = dr["SubjectName"].ToString();
sub.GradeId = Convert.ToInt32(dr["GradeId"]);
sub.ClassHour = Convert.ToInt32(dr["ClassHour"]);
list.Add(sub);
}
}
}
return list;
}
public List<Subject> GetSubjectByGrade(int gradeid)
{
List<Subject> list = new List<Subject>();
using (SqlConnection con = new SqlConnection(SqlHelper.str))
{
string sql = "select * from Subject where gradeId='" + gradeid + "'";
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
Subject sub = new Subject();
sub.SubjectId = Convert.ToInt32(dr["SubjectId"]);
sub.SubjectName = dr["SubjectName"].ToString();
sub.GradeId = Convert.ToInt32(dr["GradeId"]);
sub.ClassHour = Convert.ToInt32(dr["ClassHour"]);
list.Add(sub);
}
}
}
return list; }

在BLL层调用方法

 1  SubjectDAL dal = new SubjectDAL();
2 public List<Subject> GetSubjectName()
3 {
4 return dal.GetSubjectName();
5 }
6 public List<Subject> GetSubjectByGrade(int gradeid)
7 {
8 return dal.GetSubjectByGrade(gradeid);
9 }
10 public List<Subject> GetSubjectById(int subjectid)
11 {
12 return dal.GetSubjectById(subjectid);
13 }

在UI层编写代码,注意如果其他事件触发的顺序在窗体load事件之前,使用bool类型变量来调整先后顺序,执行完load事件后flag的值为ture,如果为True,执行其他的事件,在科目下拉框再加入一个请选择,用泛型的Insert方法将其加到下标为0的位置上!

 1  private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
2 {
3 if (flag)
4 {
5 int num = Convert.ToInt32(this.comboBox1.SelectedValue);
6
7 List < Subject > list= sub.GetSubjectByGrade(num);
8 Subject ject = new Subject();
9 ject.SubjectId = -1;
10 ject.SubjectName = "请选择";
11 list.Insert(0, ject);
12 this.comboBox2.ValueMember = "SubjectId";
13 this.comboBox2.DisplayMember = "SubjectName";
14 this.comboBox2.DataSource = list;
15 }
16 }

在DAL层编写方法,作为条件查询学生成绩的方法,根据查询条件来设置方法参数和SQL语句,实现多种条件下的模糊查询

 1 public DataTable GetList(string name, int id)
2 {
3 using (SqlConnection con = new SqlConnection(SqlHelper.str))
4 {
5 string sql = "select StudentName,subjectName,studentresult,examdate from student,result,Subject,grade where subject.gradeid=grade.GradeId and result.studentNo=student.studentNo and result.subjectid=subject.subjectid";
6 if (id != -1)
7 {
8 sql += " and Subject.Subjectid='" + id + "'";
9 }
10 if (!string.IsNullOrEmpty(name))
11 {
12 sql += " and StudentName='" + name + "'";
13 }
14 SqlDataAdapter da = new SqlDataAdapter(sql, con);
15 DataSet ds = new DataSet();
16 da.Fill(ds, "ss");
17 return ds.Tables["ss"];
18 }
19 }

在BLL层调用该方法!

1    public DataTable GetList(string name, int id)
2 {
3 return dal.GetList(name, id);
4 }

在UI层调用该方法,给方法参数赋值,实体类的属性赋值

1  private void button1_Click(object sender, EventArgs e)
2 {
3 string name = textBox1.Text;
4 int subjectid = Convert.ToInt32(comboBox2.SelectedValue);
5 DataTable dt = re.GetList(name, subjectid);
6 this.dataGridView1.DataSource = dt;
7 }

分层开发之MySchool的更多相关文章

  1. 分层开发之C#分层

    假如没有用分层开发,仔细分析三人的开发过程,很容易发现其中的问题: >三人排队式的轮番工作,花费的时间是三人工作时间之和. >后面开发的人基本都是要先花费时间熟悉前面人的代码,否则开发难以 ...

  2. Android开发之旅4:应用程序基础及组件

    引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...

  3. Android开发之旅3:android架构

    引言 通过前面两篇: Android 开发之旅:环境搭建及HelloWorld Android 开发之旅:HelloWorld项目的目录结构 我们对android有了个大致的了解,知道如何搭建andr ...

  4. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...

  5. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  6. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  7. UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)

    最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...

  8. UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)

    前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...

  9. UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件

    在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...

随机推荐

  1. AngularJS1.3一些技巧

    前言 框架选择.在上一篇文章评论中,有人说angular1.3是个过时的东西,建议使用angular2.其实这种说法很像拿jQuery1.x和jQuery2.x做比较,新的版本当然会有优化优势的地方, ...

  2. jQuery 重要的知识点归纳

    jQuery 对象 jQuery 对象就是通过 jQuery 包装 DOM 对象后产生的对象. jQuery 对象是 jQuery 独有的. 只有 jQuery 对象才能使用 jQuery 的方法,在 ...

  3. ae动态显示属性表————切记DataTable中要先Add(row)之后再往里传值。

    public partial class FrmAttributeTable : Form { private AxMapControl m_MapCtl; public FrmAttributeTa ...

  4. Nessus常见问题整理

    个别问题感谢大学霸__IT达人在Kali中文网的解答. 问题1: Kali自带Nessus产品注册失败 报Error(500):Activation failed  出现这个错误原因很多.其中有一个原 ...

  5. JSOM 对User的操作

    一.操作当前用户 //Load current user info function LoadCurUser() { var curUser; curUser = curWeb.get_current ...

  6. 获取设备的mac地址可靠的方法

    参考自:http://www.open-open.com/lib/view/open1433406847322.html /** * 获取设备的mac地址 * * @param ac * @param ...

  7. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

  8. 2016春招Android开发实习生(网易传媒)笔试

    一.单选题 1.下列不属于网络层协议的为 TCP IP IPX ICMP 2.关于activity的状态恢复,错误的是 onSaveInstanceState中,activity会自动收集恢复view ...

  9. Android实现与PHP服务器的交互

    今天算是有点小激动呢!拿到Android与PHP这个课题已经两个星期了,直到今天才算是有了一点点小收获. 虽然还是没能成功上传到服务器,不过已经看到了曙光,已经实现了一半了,那就是已经连接到了服务器. ...

  10. iOS定时器、延迟执行

    1.通用方式(并不是实时调用并且会卡顿): // 一般用于更新一些非界面上的数据 [NSTimer scheduledTimerWithTimeInterval:时间间隔 target:self se ...