一、知识点描述
1.DataTable的简介
DataTable用来存储来自数据源的一张表,调用DataAdapter的Fill()方法,可以把来自数据源的数据填充到本机的DataTable中。一个DataSet中可以包括多个DataTable,并且可以通过DataRelation设置这些DataTable之间的关系。
2.DataTable的创建
1.使用相应的DataTable构造函数创建DataTable对象。
2.使用Add方法将其添加到DataTable对象的Tables集合中,将其添加到DataSet中。
3.使用DataAdapter对象的Fill方法方法在DataSet中创建。
3.DataTable常用的属性和方法
名称 | 说明 |
---|---|
Rows | 获取或设置当前DataTable内的所有行,即相应数据表里的所有记录 |
Columns | 获取或设置当前DataTable内的所有列 |
TableName | 获取或设置当前DataTable的名称 |
DataSet | 获得包含当前表的DataSet |
PrimaryKey | 获得或设置作为数据表主键的列数组 |
Constraints | 获得表约束的集合(ConstraintCollection) |
名称 | 说明 |
---|---|
AcceptChanges() | 提交对该表的所有修改 |
NewRow() | 为当前DataTable增加一个新行,返回NewRow对象 |
Clear() | 清除DataTable中原来的数据,通常在获取新的数据前调用 |
Clone() | 借助本窗体的数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行 |
Find() | 借助本窗体的数据表的行集合的方法Find,根据主键值快速查找相应内容,并返回其所在的数据行;但数据行不能作为数据源,需另行创建数据表,并导入该数据行,最后将数据表作为数据源 |
Select() | 借助本窗体的数据表的方法Select,并提供与SQL类似的谓词表达式作为查询条件,查询将返回数据行数组 |
下面对表中的部分内容再做进一步的说明。
(1)Rows属性具有如下常用方法:
1)Add():把DataTable的NewRow()方法所创建的行追加到末尾。
2)InsertAt():把NewRow()方法所创建的行插入到索引号指定的位置。
3)Remove():删除指定的DataRow对象。
4)RemoveAt():根据索引号,直接删除指定行的数据。
(2)Columns属性具有如下常用方法:
1)Add():把新创建的列添加到列集合中。
2)AddRange():把DataColumn类型的数组添加到列集合中。
3)Remove():把指定索引名称的列从集合中移除。
4)RemoveAt():把指定索引位置的列从列集合中移除。
二、思维导图
三、示例代码及效果截图
1.创建DataTable
1.使用相应的DataTable构造函数创建DataTable对象。
this.MedicineTable = new DataTable();
2.使用Add方法将其添加到DataTable对象的Tables集合中,将其添加到DataSet中。
DataSet dataset = new dataSet( );
DataTable table = dataset.Tables.Add(“MedicineTable”);
3.使用DataAdapter对象的Fill方法在DataSet中创建。
sqlDataAdapter.Fill(this.MedicineTable);
以下是具体代码:
1)定义一个私有字段:药品表:
private DataTable MedicineTable;
2)定义一个私有字段:按名称排序的药品数据视图:
private DataView MedicineViewByName;
3)定义一个私有方法:点击载入按钮,将数据库中的表载入到数据网格视图中
用代码this.MedicineTable = new DataTable(); 来实例化本窗体的药品数据表,用于保存所有药品,以用作数据网格视图数据源:
private void btn_Load_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=医到家健康服务系统;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = "SELECT * FROM tb_Medicine;"; //指定SQL命令的命令文本;该命令查询所有药品,以用作数据网格视图数据源;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; //设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键,否则无法根据编号搜索药品;
this.MedicineTable = new DataTable(); //实例化本窗体的药品数据表,用于保存所有药品,以用作数据网格视图数据源;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(this.MedicineTable); //SQL数据适配器读取数据,并填充药品数据表;
sqlConnection.Close(); //关闭SQL连接;
this.MedicineViewByName = new DataView(); //实例化本窗体的药品数据视图,用于按照名称进行快速查询;
this.MedicineViewByName.Table = this.MedicineTable; //设置药品数据视图对应的数据表;
this.MedicineViewByName.Sort = "M_Name ASC"; //设置药品数据视图的排序条件,即查询所覆盖的列;
this.dgv_Medicine.Columns.Clear(); //数据网格视图的列集合清空;
this.dgv_Medicine.DataSource = this.MedicineTable; //将数据网格视图的数据源设为药品数据表;
this.dgv_Medicine.Columns["M_No"].HeaderText = "药品编号"; //将数据网格视图的指定列的表头文本设为中文;
this.dgv_Medicine.Columns["M_Name"].HeaderText = "药品名称";
this.dgv_Medicine.Columns["M_Price"].HeaderText = "单价";
this.dgv_Medicine.Columns["M_Type"].HeaderText = "药品类型";
this.dgv_Medicine.Columns["M_Number"].HeaderText = "药品数量";
this.dgv_Medicine.Columns["Functions"].HeaderText = "功能主治";
this.dgv_Medicine.Columns["Dosage"].HeaderText = "用法用量";
this.dgv_Medicine.Columns["SideEffect"].HeaderText = "副作用";
this.dgv_Medicine.Columns["Attention"].HeaderText = "注意事项";
}
2.常用方法
(1)Clone()和(2)Find()【因为代码都在一起,就一起展示】
Clone()代码行如下:
DataTable searchResultTable = this.MedicineTable.Clone();
//借助本窗体的药品数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
Find()代码行如下:
DataRow searchResultRow = this.MedicineTable.Rows.Find(this.txb_MedicineNo.Text.Trim());
//借助本窗体的药品数据表的行集合的方法Find,根据主键值(即药品编号)快速查找相应药品,并返回其所在的数据行;但数据行不能作为数据源,需另行创建数据表,并导入该数据行,最后将数据表作为数据源;
1)创建1.DataTable中的私有字段:药品表、私有字段:按名称排序的药品数据视图、私有方法:点击载入按钮代码
2)定义一个私有方法:点击根据名称搜索按钮,在此处用到Clone()和Find()方法:
private void btn_SearchByNo_Click(object sender, EventArgs e)
{
DataRow searchResultRow = this.MedicineTable.Rows.Find(this.txb_MedicineNo.Text.Trim()); //借助本窗体的药品数据表的行集合的方法Find,根据主键值(即课程编号)快速查找相应药品,并返回其所在的数据行;但数据行不能作为数据源,需另行创建数据表,并导入该数据行,最后将数据表作为数据源;
DataTable searchResultTable = this.MedicineTable.Clone(); //借助本窗体的药品数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
searchResultTable.ImportRow(searchResultRow); //将(复制后的)数据行导入数据表;
this.dgv_Medicine.DataSource = searchResultTable; //将数据网格视图的数据源设为搜索结果数据表;
}
运行结果如下:
1)输入药品编号,如1000000005:
2)点击根据编号搜索按钮,搜索出编号为1000000005的药品:
(3)Select()
1)创建1.DataTable中的私有字段:药品表、私有字段:按名称排序的药品数据视图、私有方法:点击载入按钮代码
Select()代码行如下:
this.MedicineTable.Select("Pinyin LIKE '%" + this.txb_Pinyin.Text.Trim() + "%'");
//借助本窗体的药品数据表的方法Select,并提供与SQL类似的谓词表达式作为查询条件,根据拼音缩写进行模糊查询(仅支持%通配符);查询将返回数据行数组;
2)定义一个私有方法:拼音文本框的文本更改:
private void txb_Pinyin_TextChanged(object sender, EventArgs e)
{
DataRow[] searchResultRows =
this.MedicineTable.Select("Pinyin LIKE '%" + this.txb_Pinyin.Text.Trim() + "%'");
//借助本窗体的药品数据表的方法Select,并提供与SQL类似的谓词表达式作为查询条件,根据拼音缩写进行模糊查询(仅支持%通配符);查询将返回数据行数组;
DataTable searchResultTable = this.MedicineTable.Clone();
//借助本窗体的药品数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
foreach (DataRow row in searchResultRows)
//遍历搜索结果所在数据行数组;
{
searchResultTable.ImportRow(row);
//数据行导入数据表;
}
this.dgv_Medicine.DataSource = searchResultTable;
//将数据网格视图的数据源设为搜索结果数据表;
}
运行结果如下:
在拼音缩写搜索框中输入如:lwdhw,即显示出六味地黄丸这个药品的信息:
(4)AcceptChanges()
代码行如下:
DataTable.AcceptChanges();
注意:AcceptChange()一定要在DataAdapter调用Update()方法后才调用。
(5)Clear
代码行如下:
DataTable.Clear()
这个方法能够将数据表清空。