思维导图
DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。也就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的。
DataSet对象的三大特性
1.独立性。DataSet独立于各种数据源。
2.离线(断开)和连接。
3.DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。
DataSet常用的属性和方法
属性 | 描述 |
---|---|
Tables | DataSet对象中包含的数据表集合 |
Relations | DataSet对象中包含的关系集合 |
CaseSensitive | 指示DataTable对象中的字符串是否区分大小写 |
EnforceConstraints | 获取或设置一个值,指示在更新操作时是否遵循约束规则 |
方法 | 描述 |
---|---|
AcceptChanges() | 提交自加载DataSet或上次调用该方法以来对其进行的更改 |
Clear() | 通过移除所有表的所有行来清除DataSet数据 |
Clone() | 复制DataSet结构,包括所有DataTable架构、关系和约束 |
Copy() | 复制DataSet结构和数据 |
HasChanges() | 获取一个值,指示DataSet中是否有增、删、改的行。 |
RejectChanges() | 回滚自加载DataSet或上次调用该方法以来对其进行的更改 |
使用Dataset的几个步骤
1.创建到数据源的连接,创建sqlCommand对象,指定一个存储过程的名字或者一个SQL语句,指定数据链路;
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ConnectionString; //配置管理器从配置文件读取连接字符串,并将之赋予SQL连接的连接字符串属性;
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = //指定SQL命令的命令文本;
"SELECT * FROM tb_ks;" //该命令分别查询所有科室,设备,查询结果将返回多张表;
+ "SELECT * FROM tb_sb;";
2.声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;并将SQL数据适配器的查询命令属性指向SQL命令;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
3.创建一个Dataset对象
DataSet dataSet = new DataSet();
4.调用SQL数据适配器读取数据,并填充数据集;
sqlDataAdapter.Fill(dataSet); //SQL数据适配器读取数据,并填充数据集;
5.操作数据。,下面用树形视图来操纵Dataset中的数据。
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient; //包含访问SQL Server所需的各类对象;
using System.Configuration; //包含访问配置文件所需的配置管理器;需事先在本项目的“引用”中添加对System.Configuration的引用;
namespace WindowsFormsApplication1
{
public partial class frm_sbmanage : Form
{
public frm_sbmanage()
{
InitializeComponent();
this.StartPosition = FormStartPosition.CenterScreen; //本窗体启动位置设为屏幕中央;
this.dgv_Student.AllowUserToAddRows = false; //数据网格视图不允许用户添加行;
this.dgv_Student.RowHeadersVisible = false; //数据网格视图的行标题不可见;
this.dgv_Student.BackgroundColor = Color.White; //数据网格视图的背景色设为白色;
this.dgv_Student.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.AllCells; //数据网格视图的自动调整列宽模式设为显示所有单元格;
}
private void sbmanage_Load(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ConnectionString; //配置管理器从配置文件读取连接字符串,并将之赋予SQL连接的连接字符串属性;
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = //指定SQL命令的命令文本;
"SELECT * FROM tb_ks;" //该命令分别查询所有科室,设备,查询结果将返回多张表;
+ "SELECT * FROM tb_sb;";
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
DataSet dataSet = new DataSet(); //声明并实例化数据集,用于保存查得的多张表;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(dataSet); //SQL数据适配器读取数据,并填充数据集;
sqlConnection.Close(); //关闭SQL连接;
DataTable ksTable = dataSet.Tables[0]; //声明科室数据表,对应数据集的表集合中的第1张数据表;
DataTable sbTable = dataSet.Tables[1]; //声明设备数据表,对应数据集的表集合中的第2张数据表;
DataRelation[] dataRelations = //声明数据关系数组;
{
new DataRelation //实例化数据关系,实现科室表,设备表之间的层次关系;
("Department_Major" //数据关系名称;
, ksTable.Columns["No"] //父表的被参照列为科室表的编号列;
, sbTable.Columns["Ksno"] //子表的参照列为设备表的科室编号列;
, false) //不创建约束(父列上的唯一约束、子列上的外键约束);
};
dataSet.Relations.AddRange(dataRelations); //将数据关系数组批量加入数据集的关系集合中;
this.trv_EducationUnit.Nodes.Clear(); //树形视图的节点集合清空;
foreach (DataRow ksRow in ksTable.Rows) //遍历科室数据表中的每一数据行;
{
TreeNode ksNode = new TreeNode(); //声明并实例化科室节点,该节点对应当前某个科室;
ksNode.Text = ksRow["Name"].ToString(); //科室节点的文本设为当前科室的名称;
this.trv_EducationUnit.Nodes.Add(ksNode); //将科室节点加入树形视图的(根)节点集合;
foreach (DataRow sbRow in ksRow.GetChildRows("Department_Major")) //借助先前定义的数据关系,遍历当前科室所在数据行的子行,即下属所有设备;
{
TreeNode sbNode = new TreeNode(); //声明并实例化设备节点,该节点对应当前某个设备;
sbNode.Text = sbRow["Name"].ToString(); //专业节点的文本设为当前设备的名称;
ksNode.Nodes.Add(sbNode); //专业节点加入当前科室节点的节点集合,成为第1级节点之一;
}
}
}
private void trv_EducationUnit_AfterSelect(object sender, TreeViewEventArgs e)
{
if (this.trv_EducationUnit.SelectedNode.Level == 1) //若树形视图的选中节点的级别为2,即选中设备节点;
{
String Name = this.trv_EducationUnit.SelectedNode.Text.ToString (); //将树形视图的选中节点的标签转为整型,即可获得事先保存的设备编号;
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ConnectionString; //配置管理器从配置文件读取连接字符串,并将之赋予SQL连接的连接字符串属性;
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = "SELECT * FROM tb_sb WHERE Name=@Name;"; //指定SQL命令的命令文本;该命令查询当前选中设备的信息,以用作数据网格视图数据源;
sqlCommand.Parameters.AddWithValue("@Name", Name); //向SQL命令的参数集合添加参数的名称、值;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
DataTable sb1Table = new DataTable(); //声明并实例化数据表,用于保存当前选中设备信息,以用作数据网格视图的数据源;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(sb1Table); //SQL数据适配器读取数据,并填充设备;
sqlConnection.Close(); //关闭SQL连接;
this.dgv_Student.DataSource = sb1Table; //设置数据网格视图的数据源;
this.dgv_Student.Columns["No"].HeaderText = "编号"; //将数据网格视图的指定列的表头文本设为中文;
this.dgv_Student.Columns["Name"].HeaderText = "名称";
this.dgv_Student.Columns["Address"].HeaderText = "简介"; //将数据网格视图的指定列的表头文本设为中文;
this.dgv_Student.Columns["Date"].HeaderText = "起用时间";
this.dgv_Student.Columns["Image"].Visible = false;
this.dgv_Student.Columns["Ksno"].Visible = false;
this.dgv_Student.Columns["Value"].Visible = false;
this.dgv_Student.Columns[this.dgv_Student.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘);
}
}
private void dgv_Student_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
}
}
运行结果