使用SqlDataAdapter对象获取数据

一.             SqlDataAdapter对象

1. SqlDataAdapter特性

l           SqlDataAdapter类用作ADO.NET对象模型中和数据连接部分和未连接部分之间的桥梁。SqlDataAdapter从数据库中获取数据,并将其存储在DataSet中。SqlDataAdapter也可能取得DataSet中的更新,并将它们提交给数据库。

l             SqlDataAdapter是为处理脱机数据而设计的,调用其Fill方法填充DataSet时甚至不需要与数据库的活动连接。即如果调用Fill方法时,SqlDataAdapter与数据库的连接不是打开时,SqlDataAdapter将打开数据库连接,查询数据库,提取查询结果,将查询结果填入DataSet,然后关闭也数据库的连接。

2. SqlDataAdapter的设置

l            SqlCommand属性

SqlDataAdapter将查询结果存储到DataSet中时,SqlDataAdapter使用SqlCommandSqlConnection与数据库进行通信。SqlDataAdapter在内部使用SqlDataReader获取结果,并将信息存储到DataSet的新行。SqlCommand类的属性包括SelectCommandInsertCommandUpdateCommandDeleteCommand分别对应数据库的查询、插入、更新和删除操作。

l         TabbleMappings集合

默认情况下,SqlDataAdapter假定SqlDataReader中的列与DataSet中的列匹配,但实际情况中往往期望DataSet的架构不同于数据库的架构,因此SqlDataAdapter提供了一种将查询结果映射到DataSet结果的机制:TableMappings集合。

SqlDataAdapterTableMappings属性返回一个DataTableMappingsConnention对象,它包含DataTableMapping对象的集合。每个对象允许在数据库中的一个表(或视图或存储过程)DataSet中相对应的DataTable的名称之间建立一种映射;TableMappings对象具有ColumnMappings属性,它返回DataColumnMappings对象组成的集合,每个DataColumnMappings对象对应数据库查询结果中的一列映射到DataSetDataTable中的一列。示例代码如下:

Using System.Data.Common;

SqlDataAdapter  danew  SqlDataAdapter();

//初始化DataAdapter

DataTableMapping  tableMap;

tableMap=da.TableMappings.Add(“Table”,”Employees”);

tableMap.ColumnMappings.Add(“EmpID”,”EmployeeID”);

tableMap.ColumnMappings.Add(“LName”,”LastName”);

二.             SqlDataAdapter的创建与使用

1. 创建SqlDataAdapter

l         New 关键字

New 关键字建立新的SqlDataAdapter对象后,再设置其SqlCommand属性

       SqlDataAdapter  danew  SqlDataAdapter();

       da.SelectCommand=cmd;

l         SqlDataAdapter的构造函数

strSql是查询数符串;strConn是数据库连接字符串;cmdSqlCommand对象;cnSqlConnection对象。

*         SqlDataAdapter  danew  SqlDataAdapter(strSql,strConn);

*         SqlDataAdapter  danew  SqlDataAdapter(strSql,cn);

*         SqlDataAdapter  danew  SqlDataAdapter(cmd);

2. 获取查询中的结果

l         使用Fill方法

调用SqlDataAdapter类的Fill方法会执行存储在SqlDataAdapter对象的SqlCommand属性中的查询,并将查询结果存储在DataSet中。示例代码如下:

SqlDataAdapter  danew  SqlDataAdapter(strSql,strConn);

DataSet ds new DataSet();

da.Fill(ds);

执行以上代码后,DataSet的实例对象ds中会创建一个新的DataTable,这个DataTable拥有strSql查询语句中所包括的字段,但DataTable对象的名称为默认的Table,而不是查询语句中所查询的表的名称。

l         使用重载的Fill方法

*         指定DataTable

da.Fill(DataSet,”MyTableName”)// SqlDataAdapter填充指定DataSet的特定表。

da.Fill(DataTable);// SqlDataAdapter填充已经创建的DataTable对象。

*         Fill方法分页显示

da.Fill(DataSet,intStartRecord,intNumRecord,”TableName”);//Fill方法可能很轻松的实现分页显示,但操作效率很低。

l             调用SqlDataAdapter对象Fill方法过程的数据库连接的打开与关闭

SqlDataAdapterFill方法调用前不需要有活动的SqlConnection对象,SqlDataAdapter会自己打开strConn语句中的数据库,获取查询结果后,关闭与数据库的连接。如果已经存在SqlConnection对象,无论是否已经打开,SqlDataAdapter执行完Fill方法后,均会将SqlConnection对象返回到原始状态。

当程序中的多个SqlDataAdapter对象使用都一个SqlConnection对象时,为避免多次打开与关闭SqlConnection对象,应该在调用SqlDataAdapterFill方法前调用SqlConnectionOpen方法打开数据库的连接,待完成Fill调用后再调用SqlConnectionClose方法关闭数据库的连接。

l           DataSet中数据的更新

如果DataSet中的数据需要更新,在调用Fill方法之前应该先清除DataSetDataTable中的数据,这样可以确保DataTable中不会出现重复的数据行,也不会出现数据库中已经不存在的数据行。

3. 将查询结果映射到DataSet

l           TableMappings映射

       TabbleMappings集合控制SqlDataAdapter如何将DataSet映射到数据库。如果保持TabbleMappings集合为空,调用Fill方法,然后将DataSet作为参数,而不指定表名,SqlDataAdapter将假定您希望使用一个名为“Table”的DataTable来装载数据。

       SqlDataAdapter.TableMappings.Add(“Table”,”Employees”)

       此语句的作用是将DataSet中原来名字为“Table”的DataTable命名为“Employees”,DataSet填充数据时,按查询结果集的顺序依次填充DataSet中的TableTable1Table2……,所以给DataTable命名时需留意该DataTable是否为当前将要使用的对象。

l   TableMappingsColumnMappingsAddRange方法

构造并赋值DataTableMappingDataColumnMapping数组,再调用它们的AddRange方法将该集合整体添加到映射数组。

DataTableMapping tableMap;

tableMap=da.TableMapping.Add(“Table”,”Employees”);

DataColumnMapping[] columnMaps;

columnMaps=new DataColumnMapping[];

                                   {new DataColumnMapping (“EmpID”,”EmployeeID”),

                                    new DataColumnMapping (“LName”,”LastName”)

                                   }

tableMap.ColumnMapping.AddRange(columnMaps);

l       MissingMappingAction属性

SqlDataAdapter提取查询结果来填充DataSet时,它将检查TableMappings集合,如果存在结果集中列不在TableMappings集合时,它将查看MissingMappingAction属性的值来决定如何操作。

*         Passthrough 映射中没有出现的列仍然填充到DataSet,采用原结果集的名称;

*         Ignore  忽略映射中没有出现的列;

*         Error 在出现不匹配的情况下引发异常;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值