一、知识点描述
1.定义
DataTable是一个表示内存中数据的一个表。数据库中存储的是实体表,实体表中有一系列的数据。而DataTable即存储在内存中的表,是可以独立创建和使用的。在持久化到数据库之前,是不会对数据库产生影响的,持久化到数据库可以使用dataAdapter.Update的方法(dataAdapter是某个实例化的DataAdapter对象)。
2.DataTable的对象
DataTable的对象包括DataSet和DataView。
3.DataTable的属性
|
名称 |
说明 |
|
|---|---|---|
|
CaseSensitive |
指示表中的字符串比较是否区分大小写。 |
|
|
ChildRelations |
获取此 DataTable 的子关系的集合。 |
|
|
Columns |
获取属于该表的列的集合。 |
|
|
Constraints |
获取由该表维护的约束的集合。 |
|
|
Container |
获取组件的容器。 (继承自 MarshalByValueComponent。) |
|
|
DataSet |
获取此表所属的 DataSet。 |
|
|
DefaultView |
获取可能包括筛选视图或游标位置的表的自定义视图。 |
|
|
DesignMode |
获取指示组件当前是否处于设计模式的值。 (继承自 MarshalByValueComponent。) |
|
|
DisplayExpression |
获取或设置一个表达式,该表达式返回的值用于表示用户界面中的此表。 DisplayExpression 属性用于在用户界面中显示此表的名称。 |
|
|
Events |
获取附加到该组件的事件处理程序的列表。 (继承自 MarshalByValueComponent。) |
|
|
ExtendedProperties |
获取自定义用户信息的集合。 |
|
|
HasErrors |
获取一个值,该值指示该表所属的 DataSet 的任何表的任何行中是否有错误。 |
|
|
IsInitialized |
获取一个值,该值指示是否已初始化 DataTable。 |
|
|
Locale |
获取或设置用于比较表中字符串的区域设置信息。 |
|
|
MinimumCapacity |
获取或设置该表最初的起始大小。 |
|
|
Namespace |
获取或设置 DataTable 中所存储数据的 XML 表示形式的命名空间。 |
|
|
ParentRelations |
获取该 DataTable 的父关系的集合。 |
|
|
Prefix |
获取或设置 DataTable 中所存储数据的 XML 表示形式的命名空间。 |
|
|
PrimaryKey |
获取或设置充当数据表主键的列的数组。 |
|
|
RemotingFormat |
获取或设置序列化格式。 |
|
|
Rows |
获取属于该表的行的集合。 |
|
|
Site |
获取或设置 DataTable 的 System.ComponentModel.ISite。 (重写 MarshalByValueComponent.Site。) |
|
|
TableName |
获取或设置 DataTable 的名称。 |
4.DataTable的方法
|
名称 |
说明 |
|
|---|---|---|
|
AcceptChanges |
提交自上次调用 AcceptChanges 以来对该表进行的所有更改。 |
|
|
BeginInit |
开始初始化在窗体上使用或由另一个组件使用的 DataTable。 初始化发生在运行时。 |
|
|
BeginLoadData |
在加载数据时关闭通知、索引维护和约束。 |
|
|
Clear |
清除所有数据的 DataTable。 |
|
|
Clone |
克隆 DataTable 的结构,包括所有 DataTable 架构和约束。 |
|
|
Compute |
计算用来传递筛选条件的当前行上的给定表达式。 |
|
|
Copy |
复制该 DataTable 的结构和数据。 |
|
|
CreateDataReader |
返回与此 DataTable 中的数据相对应的 DataTableReader。 |
|
|
CreateInstance |
基础结构。创建 DataTable 的一个新实例。 |
|
|
Dispose() |
释放由 MarshalByValueComponent 使用的所有资源。 (继承自 MarshalByValueComponent。) |
|
|
Dispose(Boolean) |
释放由 MarshalByValueComponent 占用的非托管资源,还可以另外再释放托管资源。 (继承自 MarshalByValueComponent。) |
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));//创建带列名和类型的列
四、截图
点击载入前:
点击载入后:
点击更新前:
点击更新后: