欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#使用SqlDataAdapter对象获取数据的方法

程序员文章站 2022-05-25 23:10:10
本文实例讲述了c#使用sqldataadapter对象获取数据的方法。分享给大家供大家参考,具体如下: 一.sqldataadapter对象 1. sqldataada...

本文实例讲述了c#使用sqldataadapter对象获取数据的方法。分享给大家供大家参考,具体如下:

一.sqldataadapter对象

1. sqldataadapter特性

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

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

2. sqldataadapter的设置

sqlcommand属性

sqldataadapter将查询结果存储到dataset中时,sqldataadapter使用sqlcommand和sqlconnection与数据库进行通信。sqldataadapter在内部使用sqldatareader获取结果,并将信息存储到dataset的新行。sqlcommand类的属性包括selectcommand、insertcommand、updatecommand、deletecommand分别对应数据库的查询、插入、更新和删除操作。

tabblemappings集合

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

sqldataadapter的tablemappings属性返回一个datatablemappingsconnention对象,它包含datatablemapping对象的集合。每个对象允许在数据库中的一个表(或视图或存储过程)与dataset中相对应的datatable的名称之间建立一种映射;tablemappings对象具有columnmappings属性,它返回datacolumnmappings对象组成的集合,每个datacolumnmappings对象对应数据库查询结果中的一列映射到dataset中datatable中的一列。示例代码如下:

using system.data.common;
sqldataadapter da=new sqldataadapter();
//初始化dataadapter
datatablemapping tablemap;
tablemap=da.tablemappings.add("table","employees");
tablemap.columnmappings.add("empid","employeeid");
tablemap.columnmappings.add("lname","lastname");

二.sqldataadapter的创建与使用

1. 创建sqldataadapter

new 关键字

new 关键字建立新的sqldataadapter对象后,再设置其sqlcommand属性

sqldataadapter da=new sqldataadapter();
da.selectcommand=cmd;

sqldataadapter的构造函数

strsql是查询数符串;strconn是数据库连接字符串;cmd是sqlcommand对象;cn是sqlconnection对象。

sqldataadapter da=new sqldataadapter(strsql,strconn);
sqldataadapter da=new sqldataadapter(strsql,cn);
sqldataadapter da=new sqldataadapter(cmd);

2. 获取查询中的结果

使用fill方法

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

sqldataadapter da=new sqldataadapter(strsql,strconn);
dataset ds =new dataset();
da.fill(ds);

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

使用重载的fill方法

指定datatable

da.fill(dataset,"mytablename")
// sqldataadapter填充指定dataset的特定表。

da.fill(datatable);
// sqldataadapter填充已经创建的datatable对象。

fill方法分页显示

da.fill(dataset,intstartrecord,intnumrecord,"tablename");
//fill方法可能很轻松的实现分页显示,但操作效率很低。

调用sqldataadapter对象fill方法过程的数据库连接的打开与关闭

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

当程序中的多个sqldataadapter对象使用都一个sqlconnection对象时,为避免多次打开与关闭sqlconnection对象,应该在调用sqldataadapter的fill方法前调用sqlconnection的open方法打开数据库的连接,待完成fill调用后再调用sqlconnection的close方法关闭数据库的连接。

dataset中数据的更新

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

3. 将查询结果映射到dataset

tablemappings映射

tabblemappings集合控制sqldataadapter如何将dataset映射到数据库。如果保持tabblemappings集合为空,调用fill方法,然后将dataset作为参数,而不指定表名,sqldataadapter将假定您希望使用一个名为"table"的datatable来装载数据。

sqldataadapter.tablemappings.add("table","employees")

此语句的作用是将dataset中原来名字为"table"的datatable命名为"employees",dataset填充数据时,按查询结果集的顺序依次填充dataset中的table、table1、table2……,所以给datatable命名时需留意该datatable是否为当前将要使用的对象。

tablemappings和columnmappings的addrange方法

构造并赋值datatablemapping、datacolumnmapping数组,再调用它们的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);

missingmappingaction属性

当sqldataadapter提取查询结果来填充dataset时,它将检查tablemappings集合,如果存在结果集中列不在tablemappings集合时,它将查看missingmappingaction属性的值来决定如何操作。

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

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

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

更多关于c#相关内容感兴趣的读者可查看本站专题:《c#面向对象程序设计入门教程》、《winform控件用法总结》及《c#常见控件用法教程

希望本文所述对大家c#程序设计有所帮助。