C#中SqlDataAdapter的使用小结---转载 SqlDataAdapter概述

转载 叁木-Neil 最后发布于2018-06-07 21:29:39 阅读数 8275 收藏

展开

SqlDataAdapter对象

一、特点介绍

1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。

2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。

二、使用介绍

1、创建SqlDataAdapter

  1. string strSQL=“Select * from Customers”;

  2. SqlCommand cmd=new SqlCommand(strSQL,cn);

  3. SqlDataAdapter da=new SqlDataAdapter();

  4. da.SelectCommand=cmd;

2、SqlDataAdapter构造函数

①string strConn=“Provider=.....”;

  1. string strSQL=“select * from Customers”;

  2. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

②string strConn=“Provider=.....”;

  1. SqlConnection cn=new SqlConnection(strConn);

  2. SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);

③string strConn=“Provider=.....”;

  1. string strSQL=“select * from Customers”;

  2. SqlConnection cn=new SqlConnection(strConn);

  3. SqlCommand cmd=new SqlCommand(strSQL,cn);

  4. SqlDataAdapter da=new SqlDataAdapter(cmd);

3、从查询中获取结果

①使用Fill方法

  1. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

  2. DataSet ds=new DataSet();

  3. da.Fill(ds); //这里ds中的表名为Table

②使用Fill方法创建DataTable对象和DataColumn对象

  1. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

  2. da.TableMapping.Add(“Table”,“Customers”);

  3. DataSet ds=new DataSet();

  4. da.Fill(ds);

③使用重载Fill方法

  1. SqlDataAdapter.Fill(DataSet,“Customers”);

  2. SqlDataAdapter.Fill(DataTable);

  3. SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);

④开放和关闭连接

如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。

  1. SqlDataAdapter daCustomers,daOrders;

  2. daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);

  3. daOrders=new SqlDataAdapter(“Select * from Orders”,cn);

  4. DataSet ds=new DataSet();

  5. cn.Open();

  6. daCustomers.Fill(ds);

  7. daOrders.Fill(ds);

  8. cn.Close();

⑤多次调用Fill方法

刷新DataSet中的数据,最简单的解决方法就是清空DataSet(或DataTable),然后再次调用DataAdapter对象的Fill方法。三、属性方法事件介绍

1、属性

①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)。

②DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。

③InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。

④SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。

⑤UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。

⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。

⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。

2、方法

①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。

②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。

③GetFillParameters:为SelectCommand获取一个包含着参数的数组。

④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。

3、事件

①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。

②RowUpdated:向数据库提交一个修改的行之后被触发。

③RowUpdating:向数据库提交一个修改的行之前被触发。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

数据库

SqlDataAdapter的UpdateCommand的执行机制是:当调用SqlDataAdapter.Update()时,检查DataSet中的所有行,然后对每一个修改过的Row执行SqlDataAdapter.UpdateCommand ,也就是说如果未修改DataSet中的数据,SqlDataAdapter.UpdateCommand不会执行。

1、在使用Fill方式时,可以指定DataTable,而不是DataSet:

1

2

3

4

5

6

stringstrConn="u;//SQL Server链接字符串

strSql="SELECT * FROM 表名";

SqlDataAdapter da =newSqlDataAdapter(strSql, strConn);

DataTable tbl=newDataTable( );

da.Fill(tbl);

2、注意打开和关闭连接的处理

在调用SqlCommand对象执行sql命令之前,需要保证与该对象关联的SqlConnection对象是打开的,否则SqlCommand的方法执行时将引发一个异常,但是我们在上面的代码中看到,SqlDataAdapter没有这样的要求。

如果调用SqlDataAdapter的Fill方法,并且其SelectCommand属性的SqlConnection是关闭状态,则SqlDataAdapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用Fill方法前,SqlConnection是打开的,则查询执行完毕后,SqlConnection还将是打开的,也就是说SqlDataAdapter会保证SqlConnection的状态恢复到原来的情形

1

2

3

4

5

6

7

8

9

10

11

12

13

14

stringstrConn="u;//SQL Server链接字符串

SqlConnection conn=newSqlConnection(strConn);

SqlDataAdapter daCustomers,daOrders;

strSql="SELECT * FROM Customers";

daCustomers =newSqlDataAdapter(strSql, conn);

strSql="SELECT * FROM Orders";

daOrders=newSqlDataAdapter(strSql, conn);

DataSet ds=newDataSet();

daCustomers.Fill(ds,"Customers");

daOrders.Fill(ds,"Orders");

以上代码会导致连接被打开和关闭两次,在调用Fill方法时各一次。为了避免打开和关闭SqlConnection对象,在调用SqlDataAdapter对象的Fill方法之前,我们可以先打开SqlConnection对象,如果希望之后关闭连接,我们可以再调用Close方法,就像这样:

1

2

3

4

5

6

7

8

9

10

11

12

conn.Open()

strSql="SELECT * FROM Customers";

daCustomers =newSqlDataAdapter(strSql, conn);

strSql="SELECT * FROM Orders";

daOrders=newSqlDataAdapter(strSql, conn);

DataSet ds=newDataSet();

daCustomers.Fill(ds,"Customers");

daOrders.Fill(ds,"Orders");

conn.Close();

3、多次调用Fill方法需要注意数据重复和有效更新数据的问题

推荐的做法是,在调用Fill方法前,先删除本地DataSet中缓存的数据!