当前位置: 移动技术网 > IT编程>开发语言>c# > C#使用SqlDataAdapter对象获取数据的方法

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

本文实例讲述了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#程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网