DataSet是数据集,DataTable是数据表,DataSet存储多个DataTable。DataSet和DataTable像是专门存储数据的一个容器,在你查询数据库得到一些结果时可以存在里面。
DataSet功能强大有浏览、排序、搜索、过滤、处理分级数据、缓存更改等功能,还可以与XML数据互换。DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作 ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的,一旦移到下一行就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet的数据是与数据库断开的。DataSet还可用于多层应用程序中,如果应用程序运行在中间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。
在执行对表中数据的查询时还能将数据保存到 DataSet 中,但需要借助 DataAdapter 类来实现。在实际应用中,DataAdapter 与 DataSet 是在查询操作中使用最多的类。此外,还可以通过 DataSet 实现对表中数据的增加、修改、删除操作。
使用 DataSet 和 DataTable 类存放查询结果
在实际应用中,将查询结果存储到 DataSet 类或 DataTable 类中均可,在操作查询结果时也非常类似。下面分别通过实例来演示 DataSet 和 DataTable 的使用。
【实例】创建 Windows 应用程序,查询数据库carsys用户信息表(Brand)中的所有用户名,并将用户名显示在列表控件(ListBox)中。根据题目要求,设置用户信息查询界面如下图所示。
一、SqlDataAdapter和DataSet配合使用
单击button1按钮,将所有用户名显示到 ListBox 控件中,首先使用 DataSet 对象存储查询结果,代码如下。
第一步:创建一个WINFORM窗体,窗体上有一个button1按钮和一个listBox1下拉框。
第二步:添加MySQL数据库引用
接着在程序中添加MySQL命名空间引用
using MySql.Data.MySqlClient;
完整的程序代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string constr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
//创建 SQLConnection 的实例
MySqlConnection connection = new MySqlConnection(constr);//创建一个SqlConnection对象
try //将可能出错的语句放在try语句里
{
connection.Open();
string sqlstr = "select * from Brand";//声明一个字符串,用来存放查询数据库表语句
//创建 SQLDataAdapter 类的对象
MySqlDataAdapter sda = new MySqlDataAdapter(sqlstr, connection);
//创建DataSet类的对象
DataSet ds = new DataSet();
//使用SQLDataAdapter对象sda将查询结果填充到Dataset对象ds中
sda.Fill(ds);
//设置ListBox控件的数据源(DataSource)属性
listBox1.DataSource = ds.Tables[0];
//在listBox控件中显示name列的值
listBox1.DisplayMember = ds.Tables[0].Columns[1].ToString();
}
catch (Exception ex)
{
MessageBox.Show("查询失败!" + ex.Message);
}
finally
{
if (connection != null)
{
//关闭数据库连接
connection.Close();
}
}
}
}
}
数据库carsys用户信息表(Brand)中的信息参见下图。
运行该窗体,鼠标点击button1按钮后,效果如下图所示。
从上面的运行效果可以看出,已经将用户信息表 (Brand) 中的所有用户名显示在列表控件 (ListBox) 中。
需要注意的是,ListBox 控件中的 DataSource 属性用于设置控件中内容的数据源,并需要通过 DisplayMember 属性来指定显示在 ListBox 控件中的内容。
二、SqlDataAdapter和DataTable配合使用
在本实例中将 DataSet 对象换成 DataTable 对象,更改部分代码如下。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace WindowsFormsApp4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string constr = "Server=localhost;UserId=root;Password=68331;Database=CarSYS;pooling=false;CharSet=utf8;port=3306";//声明一个字符串用来存放连接数据库的信息
//创建 SQLConnection 的实例
MySqlConnection connection = new MySqlConnection(constr);//创建一个SqlConnection对象
try //将可能出错的语句放在try语句里
{
connection.Open();
string sqlstr = "select * from Brand";//声明一个字符串,用来存放查询数据库表语句
//创建 SQLDataAdapter 类的对象
MySqlDataAdapter sda = new MySqlDataAdapter(sqlstr, connection);
//创建 DataTable 类的对象
DataTable dt = new DataTable();
//使用 SqlDataAdapter对象sda将查询结果填充到DataTable对象dt中
sda.Fill(dt);
//设置ListBox控件的数据源(DataSource)属性
listBox1.DataSource = dt;
//在listBox控件中显示name列的值
listBox1.DisplayMember = dt.Columns[1].ToString();
}
catch (Exception ex)
{
MessageBox.Show("查询失败!" + ex.Message);
}
finally
{
if (connection != null)
{
//关闭数据库连接
connection.Close();
}
}
}
}
}
运行效果和上面一样,参见下图。