学习笔记:如何在前端界面操作数据表
思维导图:
1、载入数据表:将SQL命令连接属性指向SQL连接,SQL命令查询表的内容,使用数据适配器将查询命令属性指向SQL命令,声明并实例化数据表用以保存数据,以用作数据网格视图的数据源,用数据适配器填充数据表
2、数据表的插入、更新、删除:向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名;将SQL数据适配器的属性InsertCommand指向用于插入记录的SQL命令,将SQL数据适配器的属性UpdateCommand指向用于更新记录的SQL命令,将SQL数据适配器的属性DeleteCommand指向用于删除记录的SQL命令;声明数据表,并指向数据网格视图的数据源;数据源默认类型为object,还需强制转换类型;SQL数据适配器根据数据表提交所有更新,并返回受影响行数
3、查询:设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键;借助数据表的方法Copy来复制数据表,实例化数据视图,用于进行快速查询;借助数据表的行集合的方法Find,根据主键值快速查找相应课程,并返回其所在的数据行;但数据行不能作为数据源,需另行创建数据表,并导入该数据行,最后将数据表作为数据源;借助数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
示例:
在这个例子中,因为主键是自动编号,所以将主键进行隐藏不显示不修改
public partial class frm_Systemadmin : Form { private DataTable DepartmentTable; private DataView DepartmentViewByName; public frm_Systemadmin() { InitializeComponent(); this.StartPosition = FormStartPosition.CenterScreen; //本窗体启动位置设为屏幕中央; this.dgv_department .RowHeadersVisible = false; //数据网格视图的行标题不可见; this.dgv_department .BackgroundColor = Color.White; //数据网格视图的背景色设为白色; this.dgv_department .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //数据网格视图的自动调整列宽模式设为显示所有单元格; } private void btn_research_Click(object sender, EventArgs e) { DataRowView[] searchResultRowViews = this.DepartmentViewByName .FindRows(this.txb_department .Text.Trim()); //借助本窗体的按名称排序的课程数据视图的方法FindRows,根据排序列(即课程名称)快速查找相应课程;由于该列并非主键,可能返回多行查询结果,故返回数据行视图数组;数据行视图数组不能直接作为数据源,需转为列表后方可作为数据源; DataTable searchResultTable = this.DepartmentTable .Clone(); //借助本窗体的课程数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行; foreach (DataRowView dataRowView1 in searchResultRowViews) //遍历搜索结果所在数据行视图数组; { searchResultTable.ImportRow(dataRowView1.Row); //通过每条数据行视图的属性Row获取相应的数据行,并导入数据表; } this.dgv_department .DataSource = searchResultTable; //将数据网格视图的数据源设为搜索结果数据表; } private void frm_Systemadmin_Load(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=医院门诊预约管理系统;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = "SELECT * FROM tb_Department;"; //指定SQL命令的命令文本;该命令查询所有学生; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器; sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; //设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键; this.DepartmentTable = new DataTable(); //声明并实例化数据表,用于保存所有学生,以用作数据网格视图的数据源; sqlConnection.Open(); //打开SQL连接; sqlDataAdapter.Fill(DepartmentTable); //SQL数据适配器读取数据,并填充学生数据表; sqlConnection.Close(); //关闭SQL连接; this.DepartmentViewByName = new DataView(); this.DepartmentViewByName.Table= this.DepartmentTable; this.DepartmentViewByName.Sort = "Name ASC"; //设置课程数据视图的排序条件,即查询所覆盖的列 this.dgv_department.DataSource = DepartmentTable; //将数据网格视图的数据源设为学生数据表; this.dgv_department .Columns["Name"].HeaderText = "科室名"; this.dgv_department.Columns["No"].Visible = false; this.dgv_department.Columns[this.dgv_department.Columns.Count - 1].AutoSizeMode = //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘); DataGridViewAutoSizeColumnMode.Fill; } private void dgv_department_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void btn_update_Click(object sender, EventArgs e) { SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=医院门诊预约管理系统;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand insertCommand = new SqlCommand(); //声明并实例化SQL命令;该命令用于插入记录; insertCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; insertCommand.CommandText = //指定SQL命令的命令文本; "INSERT tb_Department" + "(Name)" + " VALUES(@Name);"; insertCommand.Parameters.Add("@Name", SqlDbType.VarChar, 0, "Name"); //向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名; SqlCommand updateCommand = new SqlCommand(); //声明并实例化SQL命令;该命令用于更新记录; updateCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; updateCommand.CommandText = //指定SQL命令的命令文本; "UPDATE tb_Department" + " SET Name=@Name" + " WHERE No=@No;"; updateCommand.Parameters.Add("@Name", SqlDbType.VarChar, 0, "Name"); //向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名; updateCommand.Parameters.Add("@No", SqlDbType.VarChar,0 , "No"); SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器; sqlDataAdapter.InsertCommand = insertCommand; //将SQL数据适配器的属性InsertCommand指向用于插入记录的SQL命令; sqlDataAdapter.UpdateCommand = updateCommand; //将SQL数据适配器的属性UpdateCommand指向用于更新记录的SQL命令; DataTable DepartmentTable = (DataTable)this.dgv_department .DataSource; //声明数据表,并指向数据网格视图的数据源;数据源默认类型为object,还需强制转换类型; sqlConnection.Open(); //打开SQL连接; int rowAffected = sqlDataAdapter.Update(DepartmentTable); //SQL数据适配器根据学生数据表提交所有更新,并返回受影响行数; sqlConnection.Close(); //关闭SQL连接; MessageBox.Show("更新" + rowAffected.ToString() + "行。"); //在消息框显示受影响行数; } }
4、网格视图
private void frm_hospitaladmin_Load(object sender, EventArgs e) { this.PageSize = 10; //设置每页大小为10(行记录); this.CurrentPageNo = 1; //设置当前页号为1; SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接; sqlConnection.ConnectionString = "Server=(local);Database=医院门诊预约管理系统;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证); SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令; SqlCommand sqlCommand1 = new SqlCommand(); SqlCommand sqlCommand2 = new SqlCommand(); //声明并实例化SQL命令; sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand1.Connection = sqlConnection; sqlCommand2.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接; sqlCommand.CommandText = "SELECT * FROM tb_Department;"; //指定SQL命令的命令文本;该命令查询所有班级,以用作下拉框数据源; sqlCommand1.CommandText = "SELECT * FROM tb_doctorTitle"; sqlCommand2.CommandText = "SELECT * FROM tb_doctor;"; //指定SQL命令的命令文本;该命令查询所有学生; SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器; sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令; DataTable DepartmentTable = new DataTable(); //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源; SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter(); //声明并实例化SQL数据适配器; sqlDataAdapter1.SelectCommand = sqlCommand1; //将SQL数据适配器的查询命令属性指向SQL命令; DataTable TitleTable = new DataTable(); SqlDataAdapter sqlDataAdapter2 = new SqlDataAdapter(); //声明并实例化SQL数据适配器; sqlDataAdapter2.SelectCommand = sqlCommand2; //将SQL数据适配器的查询命令属性指向SQL命令; DataTable DoctorTable = new DataTable(); //声明并实例化数据表,用于保存所有学生,以用作数据网格视图的数据源; sqlConnection.Open(); //打开SQL连接; sqlDataAdapter.Fill(DepartmentTable); //SQL数据适配器读取数据,并填充班级数据表; sqlDataAdapter1.Fill(TitleTable); sqlDataAdapter2.Fill(DoctorTable); //SQL数据适配器读取数据,并填充学生数据表; sqlConnection.Close(); //关闭SQL连接; this.dgv_doctor .Columns.Clear(); //数据网格视图的列集合清空; this.dgv_doctor .DataSource = DoctorTable; //将数据网格视图的数据源设为学生数据表; this.dgv_doctor.Columns["No_hospital"].HeaderText = "医院编号"; //将数据网格视图的指定列的表头文本设为中文; this.dgv_doctor.Columns["No_doctor"].HeaderText = "医生编号"; this.dgv_doctor.Columns["Name_doctor"].HeaderText = "姓名"; this.dgv_doctor.Columns["Gender_doctor"].HeaderText = "性别"; this.dgv_doctor.Columns["BirthDate_doctor"].HeaderText = "生日"; this.dgv_doctor.Columns["employDate"].HeaderText = "就职日期"; this.dgv_doctor.Columns["Graduate_doctor"].HeaderText = "毕业院校"; this.dgv_doctor.Columns["Remain_doctor"].HeaderText = "可预约数"; this.dgv_doctor.Columns["Department_No"].Visible = false; //将数据网格视图的指定列设为不可见; this.dgv_doctor.Columns["TitleNo"].Visible = false; this.dgv_doctor.Columns[this.dgv_doctor.Columns.Count - 1].AutoSizeMode = //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘); DataGridViewAutoSizeColumnMode.Fill; DataGridViewComboBoxColumn DepartmentColumn = new DataGridViewComboBoxColumn(); //声明并实例化数据网格视图下拉框列,用于设置学生的班级; DepartmentColumn.Name = "Department"; //设置下拉框列的名称; DepartmentColumn.HeaderText = "科室"; //设置下拉框列的表头文本; DepartmentColumn.DataSource = DepartmentTable; //设置下拉框列的数据源为班级数据表; DepartmentColumn.DisplayMember = "Name"; //设置下拉框列的显示成员为(班级数据表的)名称(列); DepartmentColumn.ValueMember = "No"; //设置下拉框列的值成员为(班级数据表的)编号(列); DepartmentColumn.DataPropertyName = "Department_No"; //设置下拉框列的数据属性名称为(学生数据表的)班级编号(列); DepartmentColumn.DisplayIndex = 4; //设置下拉框列的显示顺序; DepartmentColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //设置下拉框列的自动调整列宽模式为填充; this.dgv_doctor.Columns.Add(DepartmentColumn); DataGridViewComboBoxColumn TitleColumn = new DataGridViewComboBoxColumn(); //声明并实例化数据网格视图下拉框列,用于设置学生的班级; TitleColumn.Name = "Title"; //设置下拉框列的名称; TitleColumn.HeaderText = "职称"; //设置下拉框列的表头文本; TitleColumn.DataSource = TitleTable; //设置下拉框列的数据源为班级数据表; TitleColumn.DisplayMember = "Title"; //设置下拉框列的显示成员为(班级数据表的)名称(列); TitleColumn.ValueMember = "No_doctorTitle"; //设置下拉框列的值成员为(班级数据表的)编号(列); TitleColumn.DataPropertyName = "Title_No"; //设置下拉框列的数据属性名称为(学生数据表的)班级编号(列); TitleColumn.DisplayIndex = 5; //设置下拉框列的显示顺序; TitleColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //设置下拉框列的自动调整列宽模式为填充; this.dgv_doctor.Columns.Add(TitleColumn); }