C#应用实训|任务3 查询、修改学生信息
发布者:唯众
布时间:2020-12-21 14:17:41
点击量:
任务描述
单击主窗体菜单的查看学生信息菜单,弹出显示所有学生信息窗体。窗体中列名必须是中文,该窗体只能显示,不能进行添加或修改或删除操作。
单击主窗体菜单的修改学生信息菜单,弹出修改学生信息窗体。窗体加载时,下方的列表显示所有学生信息,用户选中某行数据,将数据显示在上方对应文本框中,供用户修改,其中显示学号文本框中加载的学号是主键,不允许修改,窗体中列名必须是中文。
知识引入
- 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 创建数据集和检索数据集数据
- DataGridView对象
(1)DataGridView控件概述
在数据库编程中使用数据绑定控件时,DataGridView控件是最通用、功能最强和最灵活的控件。使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据。DataGridView 控件以表的形式显示数据,并可根据需要支持数据编辑的功能,如添加、修改、删除、排序、分页等。DataGridView 控件中的每一列,都与数据源的一个字段绑定。字段属性名称显示为列标题,数据值在相应的列下面显示为文本。
DataGridView控件和其他控件一样,在“工具箱”窗体中拖放或双击DataGridView即可在窗体中添加并使用,该控件加载到窗体显示如图8-15所示:
图8-15 在窗体中添加DataGridView
(2)数据源(DataSource)
DataGridView显示数据的方式非常灵活。该控件的DataSource属性可以设置下列任何一个数据源。
·数组
·DataTable和DataSet
·DataViewManager
·DataView
·集合类对象
·派生或实现IList或IlistSource接口的组件
- 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填充数据集和检索数据集数据
任务实现
查询、修改学生信息。
- 设计学生信息管理系统主界面窗体(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();
}
- 设计查询学生信息窗体(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];
}
- 设计修改学生信息窗体(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();
}
任务小结
- DataTable表示一个数据表,而DataColumn表示DataTable中列的结构。
- DataAdapter对象用来填充数据集和更新集到数据库,这样方便了数据库和数据集之间的交互。
- 在数据库编程中使用数据绑定控件时,DataGridView控件是Visual Studio.NET中提供的最通用、最强大和最灵活的控件。
- DataGridView控件以二维表的形式显示数据,并根据需要支持数据编辑功能。
上一篇:C#应用实训|任务2 添加、删除学生信息
下一篇:C#应用实训|项目八 知识拓展