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. LigerUi框架+jquery+ajax无刷新留言板系统的实现

    前些天发布了LigerUi框架的增.删.改代码,一堆代码真的也没一张图片.有的网友推荐上图,所有今天把涉及到这个框架的开源的留言板共享给大家.在修改的过程中可能有些不足的地方希望大家拍砖. 因为留言板 ...

  2. Jquery在线引用地址

    Jquery在线引用地址: 1. 很多网站都是使用这种方式引入,客户的浏览器可能已经缓存过了 jquery.可以直接调用本地的,速度更快… 2. Google code 使用了 cdn 技术在很多地方 ...

  3. 谈谈GIS与地理学语言

    二十一世纪初,也就是我们这代人生活的昨天和今天,伴随着"空间觉醒",GIS逐渐被人们所熟知.以地学原理为依托的地理信息系统,在学术界被称为是第三代地理学语言.这个概念首先是由号称是 ...

  4. SharePoint 2013 JavaScript API 记录

    1.获取创建者字段(Author),oListItem为SPListItem对象 oListItem.get_item('Author')只能获取到对象,获取用户名要用oListItem.get_it ...

  5. 渗透测试常规思路分析-FREEBUF

    最基础但练得好最后也非常厉害 1.  主要由于服务器配置等原因造成的信息泄露 常用google ,bing等搜索工具,轻量级的搜索出一些遗留后门,不想被发现的后台入口,中量级的搜索出一些用户信息泄露, ...

  6. Atitit.url 汉字中文路径  404 resin4 resin  解决  v2 q329

    Atitit.url 汉字中文路径  404 resin4 resin  解决  v2 q329 1. Pluginx机制1 2. Code1 3. 参考4 1. 原理 过滤器  ,,拦截jpg  w ...

  7. Convert.ChangeType不能处理Nullable类型的解决办法

    在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?. 解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完 ...

  8. 获取在线APP的素材图片

    1.打开iTunes,搜索并下载APP 2.打开下载的APP的路径 4.对ipa包进行解压 5.找到app,右键"显示包内容"进行查看 6.结果

  9. Android.mk相关知识

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握jni,就必须熟练掌握Andr ...

  10. cocoaPods框架管理工具使用

    前言:文中的"$"表示命令行,使用使不需要包含 cocoaPods的安装 因为cocoaPods需要用Gem进行安装,所以如果系统比较旧需要先升级Gem $ sudo gem up ...