哈喽,你好啊,我是雷工!
当添加人员信息的未录入验证,系统中是否已存在验证这些验证通过后,需要将数据存入数据库中。
按照分层架构的开发方法,首先在数据访问类中编写好数据访问方法,
以下为练习笔记。
01 效果演示①确认添加
当填写完人员基本信息,点击【确认添加】按钮,首先初步数据验证,是否为空,数据库中是否已经存在该身份证号信息,考勤卡号信息,通过验证后将数据存储到数据库,并显示在下方列表;
②数据库查询
确认添加完成,查询数据库中的Peoples表,可以看到添加的信息已经可以看到。
02 实现步骤2.1、数据访问层
在DAL数据访问层的PeopleServices类类中编写添加人员对象的方法;
只要是增删改,一般都是int类型;
①引入命名空间
using Models;②编写方法
编写将UI传递的人员对象信息添加到数据库的方法;
其中基本思路为:
1>编写SQL语句;
2>解析UI传递的对象;
3>向数据库提交SQL语句
/// <summary>/// 将人员对象信息保存到数据库/// </summary>/// <param name="objPeople"></param>/// <returns>返回添加人员的编号</returns>/// <exception cref="Exception"></exception>public int AddPeople(People objPeople){ //编写sql语句 StringBuilder sqlBuilder = new StringBuilder("insert into Peoples "); sqlBuilder.Append("(PeopleName,Gender,Birthday,Age,PeopleIdNo,CardNo,PhoneNumber,PeopleAddress,GroupId,PeoImage)"); sqlBuilder.Append("values('{0}','{1}','{2}',{3},{4},'{5}','{6}','{7}',{8},'{9}');select @@identity"); //解析对象 string sql = string.Format(sqlBuilder.ToString(), objPeople.PeopleName, objPeople.Gender, objPeople.Birthday.ToString("yyyy-MM-dd"), objPeople.Age, objPeople.IdNumber, objPeople.CarNo, objPeople.PhoneNumber, objPeople.Address, objPeople.GroupId, objPeople.PeoImage); //提交SQL语句 try {return Convert.ToInt32(SQLHelper.GetSingleResult(sql));//执行SQL语句,返回人员编号 } catch (Exception ex) {throw new Exception("添加人员时数据库访问异常" + ex.Message); }}2.2、图片序列成字符串
其中涉及存储图片,数据库中存储图片是将图片序列成字符串,然后存入数据库,
这里在UI层的通用文件夹Common中添加SerializeObjectToString类,
在其中添加方法,将图片对象转化为二进制字符串;
方法代码如下:
//将object类型对象转化为二进制字符串public string SerializeObject(object obj){ IFormatter formatter = new BinaryFormatter(); string result = string.Empty; using (MemoryStream stream = new MemoryStream()) {formatter.Serialize(stream, obj);byte[] byt = new byte[stream.Length];byt = stream.ToArray();result = Convert.ToBase64String(byt);stream.Flush(); } return result;}2.3、准备
①临时保存
在FrmAddPeople中编写添加人员的功能之前需要先添加一个List数组用于临时保存添加的人员对象以显示到界面的列表。
List<People> peoList = new List<People>();//用来临时保存人员对象②属性设置
在界面加载时设置DataGridView控件的属性,使其禁止自动生成列
this.dgvPeopleList.AutoGenerateColumns = false;//禁止自动生成列③扩展属性
为了在界面列表中显示组织名称,在人员实体类中添加扩展属性
//扩展属性public string GroupName { get; set; }2.4、添加人员功能
在添加人员类的添加人员按钮事件中编写实现方法;
基本思路:
1>在非空是否重复的数据验证后继续编写;
2>封装人员对象;
3>调用后台数据访问方法传递封装的对象;
①:封装人员对象代码
//封装人员对象People objPeople = new People(){PeopleName=this.txtPeopleName.Text.Trim(),Gender=this.rdoMale.Checked?"男":"女",Birthday=Convert.ToDateTime(this.dtpBirthday.Text),IdNumber=this.txtPeopleIdNo.Text.Trim(),PhoneNumber=this.txtPhoneNumber.Text.Trim(),Address=this.txtAddress.Text.Trim(),GroupId=Convert.ToInt32(this.cboGroupName.SelectedValue),GroupName=this.cboGroupName.Text,//为了列表展示Age=DateTime.Now.Year-Convert.ToDateTime(this.dtpBirthday.Text).Year,CarNo=this.txtCarNo.Text.Trim(),PeoImage=this.pbpeo.Image!=null?new Common.SerializeObjectToString().SerializeObject(this.pbpeo.Image):""};②:调用后台数据访问方法
//调用后台数据访问方法try{ int peopleId = peopleServer.AddPeople(objPeople); if(peopleId>1) { //同步显示添加的学员 objPeople.PeopleId = peopleId; this.peoList.Add(objPeople); this.dgvPeopleList.DataSource = null; this.dgvPeopleList.DataSource = this.peoList; }}catch(Exception){ throw;}03 常见问题①练习过程中出现报错,关于某某附近语法错发的,检查SQL语句拼接是否正常,是否少空格;
②还遇到界面列表数据未显示,但数据库中查询已经存在添加的数据,这时候检查控件设置,绑定的列名是否一致;
04 后记以上为将添加人员信息存储添加到数据库的实现,功能虽然实现了,但在用户体验,细节上还有值得优化的地方,后续接着练习效果优化;
大家在实际项目中是否遇到过相关的实现,可以在评论区或交流群讨论你开发过程中遇到的奇葩问题。