c#施用SqlDataReader

c#使用SqlDataReader

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);

//后继代码

同样,可以使用上述方式给其他的InsertCommandDeleteCommandUpdateCommand 属性赋值。

当在代码里使用DataAdapter对象的 SelectCommand属性获得数据表的连接数据时,如果表中数据有主键,就可以使用CommandBuilder对象来自动为这个 DataAdapter对象隐形地生成其他3InsertCommandDeleteCommandUpdateCommand 属性。这样,在修改数据后,就可以直接调用Update方法将修改后的数据更新到数据库中,而不必再使用InsertCommand DeleteCommandUpdateCommand3个属性来执行更新操作。

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:填充DataSetdataTable

根据dataTable名填充DataSet

3. int Update(DataSet dataSet)方法

当程序调用 Update 方法时,DataAdapter将检查参数DataSet每一行的RowState属性,根据RowState属性来检查DataSet里的每行是否改变和改变的类型,并依次执行所需的INSERTUPDATEDELETE 语句,将改变提交到数据库中。这个方法返回影响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对象,第二个参数是填充datasetdatatable

Da.Fill(ds, "USER");

上述代码使用DataApater对象填充DataSet对象的步骤如下。

(1) 根据连接字符串和SQL语句,创建一个SqlDataAdapter对象。这里,虽然没有出现ConnectionCommand对象的控制语句,但是 SqlDataAdapter对象会在创建的时候,自动构造对应的SqlConnectionSqlCommand对象,同时根据连接字符串自动初始化连接。要注意的是,此时SqlConnectionSqlCommand对象都处于关闭状态。

(2) 创建DataSet对象,该对象需要用DataAdapter填充。

(3) 调用DataAdapterFill方法,通过DataTable填充DataSet对象。由于跟随DataAdapter对象创建的Command里的SQL语句是访问数据库里的USER表,所以在调用Fill方法的时候,在打开对应的SqlConnectionSqlCommand对象后,会用 USER表的数据填充创建一个名为USERDataTable对象,再用该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对象,第二个参数是填充datasetdatatable

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添加一条记录,最后使用DataSetupdate方法将添加的记录提交到数据库中。执行完update语句,数据库USER中就多了一条USERIDID2USERNAMETOM的记录。

此外,上述代码出现的SqlCommandBuilder对象用来对数据表进行操作。用了这个对象,就不必再繁琐地使用DataAdapterUpdataCommand属性来执行更新操作。