辜渝傧

13037102709

027-87870986

教学实训

您当前的位置:首页 > 教学资源 > 实训方案 >

C#应用实训|任务3 查询、修改学生信息

发布者:唯众    布时间:2020-12-21 14:17:41    点击量:

任务描述

        单击主窗体菜单的查看学生信息菜单,弹出显示所有学生信息窗体。窗体中列名必须是中文,该窗体只能显示,不能进行添加或修改或删除操作。
        单击主窗体菜单的修改学生信息菜单,弹出修改学生信息窗体。窗体加载时,下方的列表显示所有学生信息,用户选中某行数据,将数据显示在上方对应文本框中,供用户修改,其中显示学号文本框中加载的学号是主键,不允许修改,窗体中列名必须是中文。

知识引入

  1. DataSet对象
(1)DataSet概述
        DataSet 是 ADO. NET结构的主要组件,它是从数据源中检索到的数据在内存中的缓存。DataSet 由一组 DataTable 对象组成,您可使这些对象与 DataRelation 对象互相关联。它的结构与真正的数据库类似,可以将DataSet当作内存中的数据库,DataSet对象表示了数据库中完整的数据,包括了表和表之间的关系等。当使用DataAdapter的Fill方法,将所连接数据库中的数据放入DataSet对象后,与数据库的连接即断开。此时,在应用程序中将直接从DataSet对象中读取数据,不再依赖于数据库。当在DataSet上完成所有的处理操作后,再将对数据的更改传回数据源。这样,在多用户共同存取的网络系统中,可有效降低数据库服务器的负担,提高数据存取的效率。数据集(DataSet)类的层次结构如图8-12所示:

图8-12  数据集(DataSet)类的层次结构
数据集(DataSet)类的组成结构如图8-13所示:
图8-13  数据集(DataSet)类的组成结构
数据集的结构类似于关系型数据库的结构。表8-5列出每个类的作用。
表8-5 
说 
DataTableCollection 包含特定数据集的所有 DataTable 对象
DataTable 表示数据集中的一个表
DataColumnCollection 表示 DataTable 对象的结构
DataRowCollection 表示 DataTable 对象中的实际数据行
DataColumn 表示 DataTable 对象中列的结构
DataRow 表示 DataTable 对象中的一个数据行
 
(2)创建数据集
使用DataSet构造函数创建数据集实例。数据集的名称是可选的,不需要指定。如果没有指定名称,则创建的数据集的默认名称为NewDataSet。例如分别创建名称为StudentInfo的数据集和不指定名称的数据集:
DataSet  stuDataSet = new DataSet(“StudentInfo”);
DataSet stu DataSet = new DataSet();
表8-6列出了DataSet类的常用属性和方法:
表8-6  DataSet类的常用属性和方法
属  说 
DataSetName 用于获取或设置当前数据集的名称
Tables 用于检索数据集中包含的表集合
方  说 
Clear 清除数据集中包含的所有表的所有行
HasChanges 返回一个布尔值,指示数据集是否更改
 
        DataSet类的最常用属性是Tables。Tables属性值是一个DataTable对象集,也就是DataSet中所有“表”的集合,每个DataTable对象代表从数据库检索到的一个表。
DataSet类中每个表的列和约束用于定义DataTable的结构。第一次创建DataTable时,其中不含该结构,通过创建DataColumn对象并将其添加至表Columns集合中来定义表结构。表8-7列出了DataTable的常用属性、方法和事件。
表8-7  DataTable的常用属性、方法和事件
属  说 
Columns 表示列的集合或DataTable包含的DataColumn
Constraints 表示特定的DataTable的约束集合
DataSet 表示DataTable所属的数据集
PrimaryKey 表示作为DataTable主键的字段或DataColumn
Rows 表示行的集合或DataTable包含的DataRow
HasChanges 返回一个布尔值,指示数据表是否更改
方  说 
AcceptChanges 提交对该表所做的所有修改
NewRow 添加新的DataRow
事  说 
ColumnChanged 修改该列中的值时激发该事件
RowChanged 修改该行中的值时激发该事件
RowDeleted 成功删除行时激发该事件
 
例如创建名称为Student的DataTable对象,并将其添加到数据集Tables集合中:
DataTable stuTable = new DataTable(“Student”);
DataSet stuDataSet = new DataSet();
stuDataSet.Tables.Add(stuTable);
8-6创建DataSet和DataTable,向DataTable中添加数据,并检索显示DataTable中的数据,代码如下:
private void FrmDS_Load(object sender, EventArgs e)
{
    // DataSet ds_Stu = new DataSet("student");//创建名为ds_Stu的数据集
    DataSet ds_Stu = new DataSet();
    //创建DataTable(表)对象,并指定其名为stuInfo
    DataTable dt_Stu = new DataTable("stuInfo");
    ds_Stu.Tables.Add(dt_Stu);
    /*
    //创建数据列
    DataColumn dc_Stu = new DataColumn();
    dc_Stu.DataType = typeof(string); //设置该数据列的数据类型
    dc_Stu.ColumnName = "stuNo";  //设置该数据列的名称
    dt_Stu.Columns.Add(dc_Stu);  //将该列添加到数据表中
    */
    //创建数据列并添加到DataTable(数据表)中
    DataColumn dc_Stu = dt_Stu.Columns.Add("stuNo",typeof(string));
    dt_Stu.Columns.Add("stuName",typeof(string));
    dt_Stu.Columns.Add("stuSex", typeof(string));
    dt_Stu.Columns.Add("stuAge",typeof(int));
    dt_Stu.Columns.Add("stuBirth",typeof(DateTime));
    //设置数据表中的主键列
     dt_Stu.PrimaryKey = new DataColumn[]
     {
       dt_Stu.Columns["stuNo"]
     };
     //定义数据行
     DataRow dr_Stu;  //注:只能定义,不能用new关键字实例化
     dr_Stu = dt_Stu.NewRow();  //在数据表中新创建一行记录
     //设置该行每一列的值
     dr_Stu["stuNo"] = "1001";
     dr_Stu["stuName"] = "刘备";
     dr_Stu["stuSex"] = "男";
     dr_Stu["stuAge"] = 18;
     dr_Stu["stuBirth"] = "2001-6-12";
     //将该行添加到表中
     dt_Stu.Rows.Add(dr_Stu);
     //新创建一行记录
     dr_Stu = dt_Stu.NewRow();
     //设置该行每一列的值
     dr_Stu["stuNo"] = "1002";
     dr_Stu["stuName"] = "张三丰";
     dr_Stu["stuSex"] = "男";
     dr_Stu["stuAge"] = 21;
     dr_Stu["stuBirth"] = "1998-3-21";
     //将该行添加到表中
     dt_Stu.Rows.Add(dr_Stu);
     //新创建一行记录
     dr_Stu = dt_Stu.NewRow();
     //设置该行每一列的值
     dr_Stu["stuNo"] = "1003";
     dr_Stu["stuName"] = "小龙女";
     dr_Stu["stuSex"] = "女";
     dr_Stu["stuAge"] = 22;
     dr_Stu["stuBirth"] = "1997-8-8";
     //将该行添加到表中
     dt_Stu.Rows.Add(dr_Stu);
     //给DataGridView添加数据源
     //dgvStuInfo.DataSource = dt_Stu;
     dgvStuInfo.DataSource = ds_Stu.Tables[0];
}
以上代码运行效果如图8-14所示:
图8-14  创建数据集和检索数据集数据
  1. DataGridView对象
(1)DataGridView控件概述
        在数据库编程中使用数据绑定控件时,DataGridView控件是最通用、功能最强和最灵活的控件。使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据。DataGridView 控件以表的形式显示数据,并可根据需要支持数据编辑的功能,如添加、修改、删除、排序、分页等。DataGridView 控件中的每一列,都与数据源的一个字段绑定。字段属性名称显示为列标题,数据值在相应的列下面显示为文本。
DataGridView控件和其他控件一样,在“工具箱”窗体中拖放或双击DataGridView即可在窗体中添加并使用,该控件加载到窗体显示如图8-15所示:
图8-15  在窗体中添加DataGridView
(2)数据源(DataSource)
DataGridView显示数据的方式非常灵活。该控件的DataSource属性可以设置下列任何一个数据源。
·数组
·DataTable和DataSet
·DataViewManager
·DataView
·集合类对象
·派生或实现IList或IlistSource接口的组件
  1. DataAdapter对象
DataSet对象表示数据源中数据的本地副本,它是Microsoft NET Framework的一个主要创新。DataSet对象本身可用来引用数据源,然而为了担当真正的数据管理工具,DataSet必须能够与数据源交互。为了实现该功能,.NET提供了DataAdapter类。
DataAdapter对象充当DataSet和数据源之间用于检索和保存数据的桥梁。DataAdapter类代表用于填充DataSet以及更新数据源的一组数据库命令和一个数据库连接。DataAdapter对象是ADO.NET数据提供程序的组成部分,该数据提供程序还包括连接对象、数据读取器对象和命令对象。
每个DataAdapter都在DataSet中的单个DataTable对象和SQL语句或存储过程所产生的单个结果集之间交换数据。可以使用DataAdpater在DataSet和数据源之间交换数据。一个常见例子是应用程序将数据从数据库读到DataSet中,然后将DateSet中的更改写回到数据库中。然而,DataAdapter可以从任何数据源中检索和更新数据(不仅仅是数据库),例如从Microsoft BizTalk服务器应用程序将数据读取到DataSet。
可以使用数据适配器来填充DataSet,并将数据的更改传送回数据源。
表8-8列出了DataAdapter类的常用属性和方法:
表8-8  DataAdapter类的常用属性和方法
属  说 
AcceptChangesDuringFill 决定在把行复制到DataTable中时对行所做的修改是否可以接受
TableMappings 容纳一个集合,该集合提供返回行和数据集之间的主映射
方  说 
Fill 用于添加或刷新数据集,以便使数据集与数据源结构匹配
FillSchema 用于在数据集中添加DataTable,以便与数据源结构匹配
Update 将DataSet里面的数值存储到数据库服务器上
 
8-7使用DataAdapter类将从SQL Server数据库中检索到的记录填充到数据集中,并检索显示DataSet中的数据,代码如下:
private void FrmSQL_Load(object sender, EventArgs e)
{
    //数据库连接字符串
    string strConn = "server = .;uid = sa;pwd = 123456ab78;database = db_shopcar";
    //连接数据库
    sqlConn = new SqlConnection(strConn);
    //查询语句
    //string strSql = "select * from goodsinfo";
    string strSql = "select id as 商品号,goods_name as 商品名称,goods_price as 价格,goods_addr as 商品产地,goods_storenum as 商品数量,goods_type as 商品类型 from goodsInfo";
    //数据适配器,从数据库中取出数据填充到DataSet数据集中。
    sqlAda = new SqlDataAdapter(strSql,sqlConn);
    //创建数据集
    DataSet ds_Stu = new DataSet();
    //填充数据集
    //查询数据库内容,将结果送入sqlAda中
    sqlAda.Fill(ds_Stu, "info");//参数2:给查询得到有表取个名称(方便以后取数据用)
    dgvStu.DataSource = ds_Stu.Tables[0];
}
以上代码运行效果如图8-16所示:
 
图8-16  使用DataAdapter填充数据集和检索数据集数据

任务实现

查询、修改学生信息。
  1. 设计学生信息管理系统主界面窗体(FrmMain.cs),效果如图8-1所示,单击主菜单程序代码如下:
8-8
(1)单击主界面添加学生信息主菜单响应事件代码如下:
private void 添加学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
    AddStudInfo astu = new AddStudInfo();
    astu.MdiParent = this;
    astu.Show();
}
(2)单击主界面删除学生信息主菜单响应事件代码如下:
private void 删除学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
    DelStuInfo dsi = new DelStuInfo();
    dsi.MdiParent = this;
    dsi.Show();
}
(3)单击主界面查看学生信息主菜单响应事件代码如下:
private void 查看学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
    QueryStudInfo qsi = new QueryStudInfo();
    qsi.MdiParent = this;
    qsi.Show();
}
(4)单击主界面修改学生信息主菜单响应事件代码如下:
private void 修改学生信息ToolStripMenuItem_Click(object sender, EventArgs e)
{
    EdiitStudInfo esi = new EdiitStudInfo();
    esi.MdiParent = this;
    esi.Show();
}
(5)单击主界面退出主菜单响应事件代码如下:
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
    Application.Exit();
}
  1. 设计查询学生信息窗体(QueryStudInf.cs),效果如图8-7所示,窗体后台程序代码如下:
8-9
public void ShowStuInfo()
{
    //数据库连接字符串
    string strConn = "server = .;uid = sa;pwd = 123456ab78;database = studentDB";
    //连接数据库
    SqlConnection sqlConn = new SqlConnection(strConn);
    //写SQL语句
    string strSql = "select * from student";
    SqlDataAdapter sda = new SqlDataAdapter(strSql, strConn);
    DataSet dsStu = new DataSet();
    sda.Fill(dsStu);
    dgvStuInfo.DataSource = dsStu.Tables[0];
}
  1. 设计修改学生信息窗体(EditStudInfo.cs),效果如图8-8所示,窗体后台程序代码如下:
8-10
public partial class EdiitStudInfo : Form
{
    SqlConnection sqlConn;
    SqlDataAdapter sda;
    DataSet dsStu;
    public EdiitStudInfo()
    {
        InitializeComponent();
    }
    //窗体加载
    private void EdiitStudInfo_Load(object sender, EventArgs e)
    {
        //窗体一加载在窗体下方显示所有学生信息
        ShowStuInfo();
    }
    //查询显示所有学生信息
    public void ShowStuInfo()
    {
        //数据库连接字符串
        string strConn = "server = .;uid = sa;pwd = 123456ab78;database = studentDB";
        //连接数据库
        sqlConn = new SqlConnection(strConn);
        //写SQL语句
        string strSql = "select * from student";
        sda = new SqlDataAdapter(strSql, strConn);
        dsStu = new DataSet();
        sda.Fill(dsStu);
        dgvStuInfo.DataSource = dsStu.Tables[0];
    }
    //将表格中选择中行的数据显示在上方文本框中
    private void dgvStuInfo_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        //得到选择的行的索引
        int rowIndex = e.RowIndex;
        //取出数据并显示到界面上
        //dtpStudyDate.Value = (DateTime)dgvStuInfo.Rows[rowIndex].Cells["colStudyDate"].Value;
        txtStuId.Text = dgvStuInfo.Rows[rowIndex].Cells["colStuID"].Value.ToString();
        txtStuName.Text = dgvStuInfo.Rows[rowIndex].Cells["colStuName"].Value.ToString();
        cmbSex.Text = dgvStuInfo.Rows[rowIndex].Cells["colStuSex"].Value.ToString();
        txtAddress.Text = dgvStuInfo.Rows[rowIndex].Cells["colstuAddress"].Value.ToString();
        dtpBirthday.Value = (DateTime)dgvStuInfo.Rows[rowIndex].Cells["colStuBirth"].Value;
    }
    //修改学生信息
    private void btnEdit_Click(object sender, EventArgs e)
    {
        //1.获取前台数据
        string stuID = txtStuId.Text;
        string stuName = txtStuName.Text;
        string stuSex = cmbSex.Text;
        string stuAddress = txtAddress.Text;
        string stuBirth = dtpBirthday.Value.ToShortDateString();
        //写SQL语句
        string strSql2 = string.Format("update student set stuName = '{0}',stuSex = '{1}',stuBirth = '{2}',stuAddress = '{3}' where stuID = '{4}'",stuName,stuSex,stuBirth,stuAddress,stuID);
        //创建命令对象,用于执行SQL语句
        SqlCommand sqlCmd = new SqlCommand(strSql2, sqlConn);
        /*****************   执行SQL语句   ***************/
        try
        {
            sqlConn.Open();
            int n = sqlCmd.ExecuteNonQuery();
            if (n > 0)
            {
                MessageBox.Show("修改记录成功!");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("发生异常,原因:\n" + ex.Message);
        }
        finally
        {
            sqlConn.Close();
        }
        //重新绑定数据
        ShowStuInfo();
    }

任务小结

  1. DataTable表示一个数据表,而DataColumn表示DataTable中列的结构。
  2. DataAdapter对象用来填充数据集和更新集到数据库,这样方便了数据库和数据集之间的交互。
  1. 在数据库编程中使用数据绑定控件时,DataGridView控件是Visual Studio.NET中提供的最通用、最强大和最灵活的控件。
  2. DataGridView控件以二维表的形式显示数据,并根据需要支持数据编辑功能。


上一篇:C#应用实训|任务2 添加、删除学生信息

下一篇:C#应用实训|项目八 知识拓展