01 DataAdapter 对象概述
DataAdapter 对象是一个数据适配器对象,是DataSet 与数据源之间的桥梁。DataAdapter 对像提供了 4 个属性,用于实现与数据源之间的互通。
SelectCommand 属性:向数据库发送查询 SQL 语句。
DeleteCommand 属性:向数据库发送删除 SQL语句。
InsertCommand 属性:向数据库发送插入 SQL 语句。
UpdateCommand 属性:向数据库发送更新 SQL 语句。
在对数据库进行操作时,只要将这 4 个属性设置成相应的 SQL语向即可。DataAdapter 对象中还有几个主要的方法,具体如下。
(1) Fill 方法用数据填充 DataSet。
语法如下:
public int Fil(DataSet dataSet,string sreTable)
dataSet:要用记录和架构(如果必要)填充的 DataSet。
返回值:已在 DataSet 中成功添加或刷新的行数,这不包括受不返回行的语句影响的行。
说明
当创建 DataAdapter 的实例时,将其读/写属性设置为初始值、MissingMappingAction 属性设置为 MissingMappingAction.Passthrough,MissingSchemaActicn 属性设置为 MissingSchemaAction.Add。
(2)Update 方法更新数据库时,DataAdapter 将调用 DeleteCommand、InsertCommand 以及 UpdateCommand 属性。
语法如下:
public int Update(DataTable dataTable)
例如,如果使用 DataAdapter 对象的 Fill 方法从数据源中提取数据并填充到 DataSet 时,就会用到 SelectCommand 属性中设置的命令对象。
02 填充 DataSet 数据集
通过 DataAdapter 对象的 Fill 方法填充 DataSet 数据集,Fill 方法使用 Select 语句从数据源中检索数据。与 Select 命令关联的 Connection 对象必须有效,但不需要将其打开。
注意
DataSet 和 DataTable 对象从 MarshalByValueComponent(实现 IComponent 并提供可选程控制的组件的基实现)继承而来,并支持用于远程处理 ISerializable 接口。
例1
创建一个 Windows 应用程序,向窗体中添加一个 Button 控件和一个 DataGridView 控件,分别用于执行数据绑定以及显示数据表中的数据。当单击 Button 控件后,程序首先连接数据库,然后创建一个 SqIDataAdapter 对象,使用该对象的 Fill 方法填充 DataSet 数据集,最后设置 DataGridView 控件的数据源,显示查询的数据。
“
代码如下:
”
SqlConnection conn;
private void button1_Click(object sender, EventArgs e)
{
//实例化 SqlConnection 变量 conn
conn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=");
//创建一个 SqlCommand 对象
SqlCommand cmd=new SqICommand("select * from tb_command",conn);
//创建一个 SqlDataAdapter 对象
SqlDataAdapter sda = new SqlDataAdapter();
//设置 SqlDataAdapter 对象的 SelectCommand 属性为 cmd
sda.SelectCommand = cmd;
//创建一个 DataSet 对象
DataSet ds = new DataSet();
//使用 SqlDataAdapter 对象的 Fill 方法填充 DataSet 数据集
sda.Fill(ds,"cs");
//设置 dataGridView1 控件的数据源
dataGridView1.DataSource = ds.Tables[0];
}
“
程序的运行结果如图1 所示。
图1 使用 Fill 方法填充 DataSet 数据集
03 更新数据源
使用 DataAdapter 对象的 Update 方法,可以将 DataSet 中修改过的数据及时地更新到数据库中,在调用 Update 方法之前,要实例化一个 CommandBuilder 类,它能自动根据 DataAdapter 的 SelectCommand 的 SQL 语句判断其他的 InsertCommand、UpdateCommand和 DeleteCommand。这样,就不用设置 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 属性,直接使用 DataAdapter 的 Update 方法来更新 DataSet、DataTable 或 DataRow 数组即可。
例2
创建一个 Windows 应用程序,查询 tb_command 表中的所有数据并将其显示在 DataGridView 控件中,单击某条数据,会显示其详细信息。当对某条数据进行修改后,单击“修改”按钮,使用 DataAdapter 对象的 Update 方法更新数据源。
“
代码如下:
”
SqlConnection conn; //声明一个 SqlConnection 变量
DataSet ds; //声明一个 DataSet 变量
SqlDataAdapter sda; //声明一个 SqlDataAdapter 变量
private void Form1_Load(object sender, EventArgs e)
{
//实例化 SqlConnection 变量 conn,连接数据库
conn = new SqlConnection("server=.;database=db_15;uid=sa; pwd=");
//创建一个 SqlCommand 对象
SqlCommand cmd = new SqlCommand("select * from tb_command",conn);
//实例化 SqlDataAdapter 对象
sda = new SqlDataAdapter();
//设置 SqlDataAdapter 对象的 SelectCommand 属性为 cmd
sda.SelectCommand = cmd;
//实例化 DataSet
ds = new DataSet();
//使用 SqlDataAdapter 对象的 Fill 方法填充 DataSet
sda.Fill(ds,"cs");
//设置 dataGridView1 控件的数据源
dataGridView1.DataSource = ds.Tables[0];
}
private void button1_Click(object sender, EventArgs e)
{
DataTable dt = ds.Tables["cs"]; //创建一个 DataTable
sda.FillSchema(dt, SchemaType.Mapped); //把表结构加载到 tb_command 表中
DataRow dr = dt.Rows.Find(txtNo.Text); //创建一个 DataRow
//设置 DetaRow 中的值
dr["姓名"] = txtName.Text.Trim();
dr["性别"] = this.txtSex.Text.Trim();
dr["年龄"] = this.txtAge.Text.Trim();
dr["奖金"] = this.txtJJ.Text.Trim();
//实例化一个 SqLCommandBuilder
SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(sda);
//调用其 Update 方法将 DataTable 更新到数据库中
sda.Update(dt);
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
//在 dataGridView1 控件的 CellClick 事件中实现单击某条数据显示详细信息
txtNo.Text= dataGridView1.SelectedCells[0].Value.ToString();
txtName.Text = dateGridView1.SelectedCells[1].Value.ToString();
txtSex.Text = dataGridView1.SelectedCells[2].Value.ToString();
txtAge.Text = dataGridView1.SelectedCells[3].Value.ToString();
txtJJ.Text = dataGridView1.SelectedCells[4].Value.ToString();
}
“
程序的运行结果如图2 所示 。
图2 更新数据源
注意
在 DataTable 对象上可以多次使用 Fill 方法,如果主键存在,则传入行会与已有的匹配行合并;如果主键不存在,则传入行会追加到 DataTable 中。
往期推荐
C# 分部类
C# 类型转换
C# 迭代器
C# 线程的基本操作(一)
C# 线程的基本操作(二)
C# 线程的基本操作(三)
Love life,love yourself
关注小编不迷路呦~
公众号【Csharp编程大全】,需要进技术群交流的,请添加小编mm1552923!