一、知识点描述
1.定义
DataTable是一个表示内存中数据的一个表。数据库中存储的是实体表,实体表中有一系列的数据。而DataTable即存储在内存中的表,是可以独立创建和使用的。在持久化到数据库之前,是不会对数据库产生影响的,持久化到数据库可以使用dataAdapter.Update的方法(dataAdapter是某个实例化的DataAdapter对象)。
2.DataTable常用属性
属性 | 描述 |
---|---|
Columns | 它用于获取属于此表的列的集合 |
Constraints | 它被用来获取由这个表维护的约束的集合 |
DataSet | 它用于获取此表所属的DataSet |
DefaultView | 它用于获取可能包含过滤视图的表的自定义视图 |
HasErrors | 它用于获取指示DataSet表中的任何行中是否存在错误的值 |
MinimumCapacity | 它用于获取或设置此表的初始起始大小 |
PrimaryKey | 它用于获取或设置一个用作数据表主键的列数组 |
Rows | 它用于获取属于此表的行的集合 |
TableName | 它用于获取或设置DataTable的名称 |
3.DataTable常用方法
属性 | 描述 |
---|---|
AcceptChanges() | 它用于提交对此表进行的所有更改 |
Clear() | 它用来清除所有数据的DataTable |
Clone() | 它被用来克隆DataTable的结构 |
Copy() | 它用于复制DataTable的结构和数据 |
CreateDataReader() | 它用于返回与此DataTable中的数据相对应的DataTableReader |
CreateInstance() | 它用于创建DataTable的新实例 |
GetRowType() | 它用于获取行类型 |
GetSchema() | 它用来获取表的模式 |
ImportRow(DataRow) | 它用于将DataRow复制到DataTable中 |
Load(IDataReader) | 它用于使用提供的IDataReader从数据源填充DataTable |
Merge(DataTable, Boolean) | 它用于合并指定的DataTable和当前的DataTable |
NewRow() | 它用于创建一个与表具有相同模式的新DataRow |
Select() | 它用于获取所有DataRow对象的数组 |
WriteXml(String) | 用于使用指定的文件将DataTable的当前内容写为XML |
4.构造函数
DataTable() 不带参数初始化DataTable 类的新实例。
DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例。
DataTable(string tableName, string tableNamespace) 用指定的表名和命名空间初始化DataTable类的新实例。
5.DataSet与DataTable
DataSet中可包括多个 DataTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些DataRow、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的 Update方法。
二、思维导图
三、示例代码
1.添加引用
using System.Data;
2.利用SQL数据适配器创建并填充数据表
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = "SELECT * FROM tb_Drug;";
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; //设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键;
this.DrugTable = new DataTable(); //实例化本窗体的药品数据表,用于保存所有药品,以用作数据网格视图数据源;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(this.DrugTable); //SQL数据适配器读取数据,并填充药品表;
sqlConnection.Close();
3.添加行
foreach (DataRow row in searchResultRows) //遍历搜索结果所在数据行数组;
{
searchResultTable.ImportRow(row); //数据行导入数据表;
}
this.dgv_Drug.DataSource = searchResultTable; //将数据网格视图的数据源设为搜索结果数据表;
4.复制表
//复制表,同时复制了表结构和表中的数据
DataTable dtNew = new DataTable();
dtNew = dt.Copy();
//复制表
DataTable dtNew = dt.Copy(); //复制dt表数据结构
dtNew.Clear() //清空数据
for (int i = 0; i < dt.Rows.Count; i++)
{
if (条件语句)
{
dtNew.Rows.Add(dt.Rows[i].ItemArray); //添加数据行
}
}
//克隆表,只是复制了表结构,不包括数据
DataTable dtNew = new DataTable();
dtNew = dt.Clone();
//如果只需要某个表中的某一行
DataTable dtNew = new DataTable();
dtNew = dt.Copy();
dtNew.Rows.Clear();//清空表数据
dtNew.ImportRow(dt.Rows[0]);//这是加入的是第一行
5.创建行、列
DataRow dr = dt.NewRow();//创建空行
dt.Rows.Add(dr);//创建空行
DataColumn dc = new DataColumn();//创建空列
dt.Columns.Add(dc);//创建带列名的列
dt.Columns.Add("总价", typeof(String));//创建带列名和类型的列
四、运行效果
点击载入前:
点击载入后:
在检索框输入“牛黄“,点击根据名称检索,可以实现模糊检索:
点击更新前:
我们对“牛黄解毒片”的零售价、是否为处方药以及供应商直接在数据表中进行更改,然后点击更新: