思维导图:
1、下拉框思维导图:
2、搜索思维导图:
本篇文章主要讲的是如何在前端界面操作数据表,以及代码和运行结果的展示。
此次的重点有三个方面,包括在表格中展示下拉框效果、按拼音首字母查询、通过Excel将数据导入的方法。
添加如下控件:
一、数据库在前端显示的表格中展示下拉框效果
① 先连接数据库,填充数据表。
② 借助本窗体的医生表的方法Copy来复制数据表,并赋予本窗体的科室数据表,用作科室下拉框的数据源;
③ 设置医生数据视图对应的数据表;
④ 声明并实例化数据网格视图下拉框列
⑤ 将数据网格视图的原本表中的科室列设为不可见
⑥ 设置下拉框列的名称、表头文本。
⑦ 设置下拉框列数据源为科室表【DataSource】、显示成员为(科室数据表的)名称(列)【DisplayMember】、值成员为(科室表的)编号(列)【ValueMember】、数据属性名称为(医生表的)科室编号(列)【DataPropertyName】
⑧ 设置下拉框列在表中的显示顺序【DisplayIndex】、自动调整列宽模式为填充【AutoSizeMode】
⑨ 将下拉框列加入数据网格视图的列集合
private void btn_Load_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=EduBaseDemo;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = "SELECT * FROM tb_Doctor;"; //指定SQL命令的命令文本;该命令查询所有课程,以用作数据网格视图数据源; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器; sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; //设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键; this.DoctorTable = new DataTable(); //实例化本窗体的课程数据表,用于保存所有课程,以用作数据网格视图数据源; sqlConnection.Open(); //打开SQL连接; sqlDataAdapter.Fill(this.DoctorTable); //SQL数据适配器读取数据,并填充课程数据表; sqlConnection.Close(); //关闭SQL连接; this.DoctorViewByName = new DataView(); //实例化本窗体的课程数据视图,用于按照名称进行快速查询; this.DoctorViewByName.Table = this.DoctorTable; //设置课程数据视图对应的数据表; this.DoctorViewByName.Sort = "Name ASC"; //设置课程数据视图的排序条件,即查询所覆盖的列; this.dgv_Doctor.Columns.Clear(); //数据网格视图的列集合清空; this.dgv_Doctor.DataSource = this.DoctorTable; //将数据网格视图的数据源设为学生数据表; this.dgv_Doctor.Columns["DOCID"].HeaderText = "编号"; //将数据网格视图的指定列的表头文本设为中文; this.dgv_Doctor.Columns["DOCName"].HeaderText = "姓名"; this.dgv_Doctor.Columns["KSID"].HeaderText = "科室"; this.dgv_Doctor.Columns["Sex"].HeaderText = "性别"; this.dgv_Doctor.Columns["Birthday"].HeaderText = "生日"; this.dgv_Doctor.Columns["Pinyin"].Visible = false; //将数据网格视图的指定列设为不可见; this.dgv_Doctor.Columns[this.dgv_Doctor.Columns.Count - 1].AutoSizeMode = //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘); DataGridViewAutoSizeColumnMode.Fill; DataGridViewComboBoxColumn KeShi = new DataGridViewComboBoxColumn(); //声明并实例化数据网格视图下拉框列,用于设置先修课程; KeShi.Name = "KeShi"; //设置下拉框列的名称; KeShi.HeaderText = "科室"; //设置下拉框列的表头文本; KeShi.DataSource = this.KeShiTable; //设置下拉框列的数据源为先修课程数据表; KeShi.DisplayMember = "KSName"; //设置下拉框列的显示成员为(先修课程数据表的)名称(列); KeShi.ValueMember = "KSID"; //设置下拉框列的值成员为(先修课程数据表的)编号(列); KeShi.DataPropertyName = "KSID"; //设置下拉框列的数据属性名称为(课程数据表的)先修课程编号(列); KeShi.DisplayIndex = 3; //设置下拉框列的显示顺序; KeShiColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //设置下拉框列的自动调整列宽模式为填充; this.dgv_KeShi.Columns.Add(KeShiColumn); //将下拉框列加入数据网格视图的列集合; }
二、前端进行按条件查询
先将数据载入表格:
namespace 手术麻醉管理系统
{
public partial class fm_医生信息 : Form
{
private DataTable DocterTable;
private DataTable KeshiTable;
private DataView DocterViewByName;
public fm_医生信息()
{
InitializeComponent();
}
private void fm_医生信息_Load(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=DESKTOP-VKS7HLB;Database=手术麻醉系统;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
SqlCommand sqlCommand2 = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand2.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = "SELECT * FROM tb_KeShi;"; //指定SQL命令的命令文本;该命令查询所有班级,以用作下拉框数据源;
sqlCommand2.CommandText = "SELECT * FROM tb_Docter;"; //指定SQL命令的命令文本;该命令查询所有学生;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
this.KeshiTable = new DataTable(); //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源;
SqlDataAdapter sqlDataAdapter2 = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter2.SelectCommand = sqlCommand2;
sqlDataAdapter2.MissingSchemaAction = MissingSchemaAction.AddWithKey; //设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键;//将SQL数据适配器的查询命令属性指向SQL命令; //将SQL数据适配器的查询命令属性指向SQL命令;
this.DocterTable = new DataTable(); //声明并实例化数据表,用于保存所有学生,以用作数据网格视图的数据源;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(KeshiTable); //SQL数据适配器读取数据,并填充班级数据表;
sqlDataAdapter2.Fill(DocterTable); //SQL数据适配器读取数据,并填充学生数据表;
sqlConnection.Close();
this.DocterViewByName = new DataView(); //实例化本窗体的课程数据视图,用于按照名称进行快速查询;
this.DocterViewByName.Table = this.DocterTable; //设置课程数据视图对应的数据表;
this.DocterViewByName.Sort = "Name ASC"; //关闭SQL连接;
this.dgv_Score.Columns.Clear(); //数据网格视图的列集合清空;
this.dgv_Score.DataSource = DocterTable; //将数据网格视图的数据源设为学生数据表;
this.dgv_Score.Columns["DOCID"].HeaderText = "医生编号"; //将数据网格视图的指定列的表头文本设为中文;
this.dgv_Score.Columns["DOCName"].HeaderText = "姓名";
this.dgv_Score.Columns["KSID"].HeaderText = "科室编码";
this.dgv_Score.Columns["KSID"].Visible = false; //将数据网格视图的指定列设为不可见;
this.dgv_Score.Columns[this.dgv_Score.Columns.Count - 1].AutoSizeMode = //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘);
DataGridViewAutoSizeColumnMode.Fill;
DataGridViewComboBoxColumn KeshiColumn = new DataGridViewComboBoxColumn(); //声明并实例化数据网格视图下拉框列,用于设置学生的班级;
KeshiColumn.Name = "Keshi"; //设置下拉框列的名称;
KeshiColumn.HeaderText = "科室"; //设置下拉框列的表头文本;
KeshiColumn.DataSource = KeshiTable; //设置下拉框列的数据源为班级数据表;
KeshiColumn.DisplayMember = "KSName"; //设置下拉框列的显示成员为(班级数据表的)名称(列);
KeshiColumn.ValueMember = "KSID"; //设置下拉框列的值成员为(班级数据表的)编号(列);
KeshiColumn.DataPropertyName = "KSID"; //设置下拉框列的数据属性名称为(学生数据表的)班级编号(列);
KeshiColumn.DisplayIndex = 4; //设置下拉框列的显示顺序;
KeshiColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //设置下拉框列的自动调整列宽模式为填充;
this.dgv_Score.Columns.Add(KeshiColumn);
}
(1)按拼音首字母查询
① 首先要在医生表中准备各个医生拼音首字母缩写,并将数据网格视图的表中的拼音列设为不可见
② 借助本窗体的医生数据表的方法Select,并提供与SQL类似的谓词表达式作为查询条件,根据拼音缩写进行模糊查询(仅支持%通配符);查询将返回数据行数组;
③ 借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
④ 遍历搜索结果所在数据行数组;
⑤ 数据行导入数据表;
⑥ 将数据网格视图的数据源设为搜索结果数据表;
DataRow[] searchResultRows = this.DocterTable.Select("PinYin LIKE '%" + this.tb_拼音 .Text.Trim() + "%'"); //借助本窗体的课程数据表的方法Select,并提供与SQL类似的谓词表达式作为查询条件,根据拼音缩写进行模糊查询(仅支持%通配符);查询将返回数据行数组; DataTable searchResultTable = this.DocterTable.Clone(); //借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行; foreach (DataRow row in searchResultRows) //遍历搜索结果所在数据行数组; { searchResultTable.ImportRow(row); //数据行导入数据表; } this.dgv_Score .DataSource = searchResultTable;
(2)按编号查询
①设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键;
②借助本窗体的医生数据表的行集合的方法Find,根据主键值(即医生编号)快速查找相应医生,并返回其所在的数据行;但数据行不能作为数据源,需另行创建数据表,并导入该数据行,最后将数据表作为数据源;
③借助本窗体的医生数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
④将(复制后的)数据行导入数据表;
⑤将数据网格视图的数据源设为搜索结果数据表;
DataRow searchResultRow = this.DocterTable.Rows.Find(this.tb_编码.Text.Trim()); //借助本窗体的课程数据表的行集合的方法Find,根据主键值(即课程编号)快速查找相应课程,并返回其所在的数据行;但数据行不能作为数据源,需另行创建数据表,并导入该数据行,最后将数据表作为数据源; DataTable searchResultTable = this.DocterTable.Clone(); //借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行; searchResultTable.ImportRow(searchResultRow); //将(复制后的)数据行导入数据表; this.dgv_Score.DataSource = searchResultTable;
(3)按姓名查询
①设置医生数据视图的排序条件,即查询所覆盖的列(姓名);
②借助本窗体的按名称排序的课程数据视图的方法FindRows,根据排序列(即医生名称)快速查找相应课程;由于该列并非主键,可能返回多行查询结果,故返回数据行视图数组;数据行视图数组不能直接作为数据源,需转为列表后方可作为数据源;
③借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
④ 遍历搜索结果所在数据行数组;
⑤ 数据行导入数据表;
⑥ 将数据网格视图的数据源设为搜索结果数据表;
DataRowView[] searchResultRowViews = this.DocterViewByName.FindRows(this.tb_姓名 .Text.Trim()); //借助本窗体的按名称排序的课程数据视图的方法FindRows,根据排序列(即课程名称)快速查找相应课程;由于该列并非主键,可能返回多行查询结果,故返回数据行视图数组;数据行视图数组不能直接作为数据源,需转为列表后方可作为数据源; DataTable searchResultTable = this.DocterTable.Clone(); //借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行; foreach (DataRowView dataRowView1 in searchResultRowViews) //遍历搜索结果所在数据行视图数组; { searchResultTable.ImportRow(dataRowView1.Row); //通过每条数据行视图的属性Row获取相应的数据行,并导入数据表; } this.dgv_Score .DataSource = searchResultTable;
三、介绍一个通过Excel将数据导入的方法
① 将保存有数据的Excel表另存为.csv格式(此为逗号分隔格式)
② 在数据中执行代码:
BULK INSERT tb_Course FROM 'C:\Course.csv' WITH (FIELDTERMINATOR=',' ,ROWTERMINATOR='\n' ,FIRSTROW=2);