1 DataAdapter对象的常用属性
DataAdapter对象的工作步骤一般有两种,一种是通过Command对象执行SQL语句,将获得的结果集填充到DataSet对象中;另一种是将DataSet里更新数据的结果返回到数据库中。
DataAdapter对象的常用属性形式为 XXXCommand,用于描述和设置操作数据库。使用DataAdapter对象,可以读取、添加、更新和删除数据源中的记录。对于每种操作的执行方式,适配器支持以下4个属性,类型都是Command,分别用来管理数据操作的“增”、“删”、“改”、“查”动作。
Ü SelectCommand属性:该属性用来从数据库中检索数据。
Ü InsertCommand属性:该属性用来向数据库中插入数据。
Ü DeleteCommand属性:该属性用来删除数据库里的数据。
Ü UpdateCommand属性:该属性用来更新数据库里的数据。
例如,以下代码能给DataAdapter对象的selectCommand属性赋值。
//连接字符串
SqlConnection conn;
//创建连接对象conn的语句
// 创建DataAdapter对象
SqlDataAdapter da = new SqlDataAdapter;
//给DataAdapter对象的SelectCommand属性赋值
Da.SelectCommand = new SqlCommand("select * from user", conn);
//后继代码
同样,可以使用上述方式给其他的InsertCommand、DeleteCommand和UpdateCommand 属性赋值。
当在代码里使用DataAdapter对象的 SelectCommand属性获得数据表的连接数据时,如果表中数据有主键,就可以使用CommandBuilder对象来自动为这个 DataAdapter对象隐形地生成其他3个InsertCommand、DeleteCommand和UpdateCommand 属性。这样,在修改数据后,就可以直接调用Update方法将修改后的数据更新到数据库中,而不必再使用InsertCommand、 DeleteCommand和UpdateCommand这3个属性来执行更新操作。
2 DataAdapter对象的常用方法
DataAdapter 对象主要用来把数据源的数据填充到DataSet中,以及把DataSet里的数据更新到数据库,同样有SqlDataAdapter和 OleDbAdapter两种对象。它的常用方法有构造函数、填充或刷新DataSet的方法、将DataSet中的数据更新到数据库里的方法和释放资源的方法。
1. 构造函数
不同类型的Provider使用不同的构造函数来完成DataAdapter对象的构造。对于SqlDataAdapter类,其构造函数说明如表所示。
表 SqlDataAdapter类构造函数说明
函 数 定 义
|
参 数 说 明
|
函 数 说 明
|
SqlDataAdapter()
|
不带参数
|
创建SqlDataAdapter对象
|
SqlDataAdapter(
SqlCommand selectCommand)
|
selectCommand:指定新创建对象的SelectCommand属性
|
创建SqlDataAdapter对象。用参数selectCommand设置其Select Com- mand属性
|
SqlDataAdapter(string
selectCommandText,SqlConnection selectConnection)
|
selectCommandText:指定新创建对象的SelectCommand属性值
selectConnection:指定连接对象
|
创建SqlDataAdapter对象。用参数selectCommandText设置其Select Command属性值,并设置其连接对象是selectConnection
|
SqlDataAdapter(string
selectCommandText,String selectConnectionString)
|
selectCommandText:指定新创建对象的SelectCommand属性值
selectConnectionString:指定新创建对象的连接字符串
|
创建SqlDataAdapter对象。将参数selectCommandText设置为Select Command属性值,其连接字符串是selectConnectionString
|
OleDbDataAdapter的构造函数类似SqlDataAdapter的构造函数,如下表所述。
表 OleDbDataAdapter类构造函数说明
函 数 定 义
|
参 数 说 明
|
函 数 说 明
|
OleDbDataAdapter()
|
不带参数
|
创建OleDbDataAdapter对象
|
OleDbDataAdapter(
OleDbCommand selectCommand)
|
selectCommand:指定新创建对象的SelectCommand属性
|
创建OleDbDataAdapter对象。用参数selectCommand设置其SelectCommand属性
|
OleDbDataAdapter(string
selectCommandText, OleDbConnection selectConnection)
|
selectCommandText:指定新创建对象的SelectCommand属性值
selectConnection:指定连接对象
|
创建SqlDataAdapter对象。用参数selectCommandText设置其SelectCommand属性值,并设置其连接对象是selectConnection
|
OleDbDataAdapter(string
selectCommandText,String selectConnectionString)
|
selectCommandText:指定新创建对象的SelectCommand属性值
selectConnectionString:指定新创建对象的连接字符串
|
创建OleDbDataAdapter对象。将参数selectCommandText设置为SelectCommand 属性值,其连接字符串是selectConnectionString
|
2. Fill类方法
当调用
Fill
方法时,它将向数据存储区传输一条 SQL SELECT 语句。该方法主要用来填充或刷新DataSet,返回值是影响DataSet的行数。该方法的常用定义如表所示。
表 DataAdapter类的Fill方法说明
函 数 定 义
|
参 数 说 明
|
函 数 说 明
|
int Fill (DataSet dataset)
|
dataset:需要更新的DataSet
|
根据匹配的数据源,添加或更新参数所指定的DataSet,返回值是影响的行数
|
int Fill (DataSet
dataset,string srcTable) |
dataset:需要更新的DataSet
srcTable:填充DataSet的dataTable名
|
根据dataTable名填充DataSet
|
3. int Update(DataSet dataSet)方法
当程序调用 Update 方法时,DataAdapter将检查参数DataSet每一行的RowState属性,根据RowState属性来检查DataSet里的每行是否改变和改变的类型,并依次执行所需的INSERT、UPDATE或DELETE 语句,将改变提交到数据库中。这个方法返回影响DataSet的行数。更准确地说,Update 方法会将更改解析回数据源,但自上次填充 DataSet 以来,其他客户端可能已修改了数据源中的数据。若要使用当前数据刷新 DataSet,应使用 DataAdapter 和 Fill 方法。新行将添加到该表中,更新的信息将并入现有行。Fill 方法通过检查 DataSet 中行的主键值及 SelectCommand 返回的行来确定是要添加一个新行还是更新现有行。如果 Fill 方法发现 DataSet 中某行的主键值与 SelectCommand 返回结果中某行的主键值相匹配,则它将用 SelectCommand 返回的行中的信息更新现有行,并将现有行的 RowState 设置为 Unchanged。如果 SelectCommand 返回的行所具有的主键值与 DataSet 中行的任何主键值都不匹配,则 Fill 方法将添加 RowState 为 Unchanged 的新行。
3 DataAdapter对象代码示例
下面的代码将说明如何利用DataAdapter对象填充DataSet对象。
private static string strConnect = "data source=localhost; uid=sa;pwd=aspnet;database=LOGINDB"
string sqlStr =" Select * from USER";
//利用构造函数,创建DataAdapter
SqlDataAdapter da = new SqlDataAdapter(sqlStr,strConnect);
//创建DataSet
DataSet ds = new DataSet();
//填充,第一个参数是要填充的dataset对象,第二个参数是填充dataset的datatable
Da.Fill(ds, "USER");
上述代码使用DataApater对象填充DataSet对象的步骤如下。
(1) 根据连接字符串和SQL语句,创建一个SqlDataAdapter对象。这里,虽然没有出现Connection和Command对象的控制语句,但是 SqlDataAdapter对象会在创建的时候,自动构造对应的SqlConnection和SqlCommand对象,同时根据连接字符串自动初始化连接。要注意的是,此时SqlConnection和SqlCommand对象都处于关闭状态。
(2) 创建DataSet对象,该对象需要用DataAdapter填充。
(3) 调用DataAdapter的Fill方法,通过DataTable填充DataSet对象。由于跟随DataAdapter对象创建的Command里的SQL语句是访问数据库里的USER表,所以在调用Fill方法的时候,在打开对应的SqlConnection和SqlCommand对象后,会用 USER表的数据填充创建一个名为USER的DataTable对象,再用该DataTable填充到DataSet中。
下面的代码演示了如何使用DataAdapter对象将DataSet中的数据更新到数据库。
private static string strConnect = "data source=localhost; uid=sa;pwd=aspnet;database=LOGINDB"
string sqlStr = "Select * from USER";
//利用构造函数,创建DataAdapter
SqlDataAdapter da = new SqlDataAdapter(sqlStr,strConnect);
//创建DataSet
DataSet ds = new DataSet();
//填充,第一个参数是要填充的dataset对象,第二个参数是填充dataset的datatable
Da.Fill(ds, "USER");
//以下代码将更新DataSet里的数据
//在DataSet里的名为"USER"的DataTable里添加一个用于描述行记录的DataRow对象
DataRow dr = ds.Tables["USER"].NewRow();
//通过DataRow对象添加一条记录
dr["USERID"] = "ID2";
dr["USERNAME"] = "TOM";
ds.Table["USER"].Rows.Add(dr);
//更新到数据库里
SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.update(ds, "USER");
在上述代码里,首先使用DataAdapter填充DataSet对象,然后通过DataRow对象,向 DataSet添加一条记录,最后使用DataSet的update方法将添加的记录提交到数据库中。执行完update语句,数据库USER中就多了一条USERID是ID2、USERNAME是TOM的记录。
此外,上述代码出现的SqlCommandBuilder对象用来对数据表进行操作。用了这个对象,就不必再繁琐地使用DataAdapter的UpdataCommand属性来执行更新操作。