sqldataadapter概述 sqldataadapter是 dataset和 sql server之间的桥接器,用于检索和保存数据。sqldataadapter通过对数据源使用适当的transact-sql语句映射 fill(它可更改dataset中的数据以匹配数据源中的数据)和 update(它可更改数据源中的数据以匹配 data
sqldataadapter概述
sqldataadapter是 dataset和 sql server之间的桥接器,用于检索和保存数据。sqldataadapter通过对数据源使用适当的transact-sql语句映射 fill(它可更改dataset中的数据以匹配数据源中的数据)和 update(它可更改数据源中的数据以匹配 dataset中的数据)来提供这一桥接。当sqldataadapter填充 dataset时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。
我们可以通过以下三种方法来创建sqldataadapter对象:
使用方法
1、通过连接字符串和查询语句
string strconn="uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
strsql="select * from 表名";
sqldataadapter da=new sqldataadapter(strsql,strconn);
dataset ds=new dataset();//创建dataset实例
da.fill(ds,"自定义虚拟表名");//使用dataadapter的fill方法(填充),调用select命令
这种方法有一个潜在的缺陷。假设应用程序中需要多个sqldataadapter对象,用这种方式来创建的话,会导致创建每个sqldataadapter时,都同时创建一个新的sqlconnection对象,方法二可以解决这个问题
2、通过查询语句和sqlconnection对象来创建
string strconn="uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
sqlconnection conn=new sqlconnection(strconn);
string strsql="select * from 表名";
sqldataadapter da = new sqldataadapter(strsql, conn);
dataset ds=new dataset();//创建dataset实例
da.fill(ds,"自定义虚拟表名");//使用dataadapter的fill方法(填充),调用select命令
3、通过sqlcommand对象来创建
string strconn="uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
sqlconnection connsql=new sqlconnection (strconn); //sql链接类的实例化
connsql.open ();//打开数据库
//使用sqldataadapter时没有必要从connection.open()打开,
//sqldataadapter会自动打开关闭它。
string strsql = "select * from 表名"; //要执行的sql语句
sqlcommand cmd=new sqlcommand(strsql,connsql);
sqldataadapter da=new sqldataadapter(cmd); //创建dataadapter数据适配器实例
dataset ds=new dataset();//创建dataset实例
da.fill(ds,"自定义虚拟表名");//使用dataadapter的fill方法(填充),调用select命令
connsql.close ();//关闭数据库
sqldataadapter da=new sqldataadapter(strsql,connsql); //创建dataadapter数据适配器实例dataset ds=new dataset();//创建dataset实例da.fill(ds,"自定义虚拟表名");//使用dataadapter的fill方法(填充),调用select命令connsql.close ();//关闭数据库
注意
如果只需要执行sql语句或sp,就没必要用到dataadapter ,直接用sqlcommand的execute系列方法就可以了。sqldataadapter的作用是实现dataset和db之间的桥梁:比如将对dataset的修改更新到数据库。
sqldataadapter的updatecommand的执行机制是:当调用sqldataadapter.update()时,检查dataset中的所有行,然后对每一个修改过的row执行sqldataadapter.updatecommand ,也就是说如果未修改dataset中的数据,sqldataadapter.updatecommand不会执行。
使用要点
1、sqldataadapter内部通过sqldatareader获取数据,而默认情况下sqldatareader不能获知其查询语句对应的数据库表名,
所以下面的代码:
string strconn = "uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
strsql="select * from 表名";
sqldataadapter da = new sqldataadapter(strsql,strconn);
dataset ds = new dataset();
da.fill(ds);
会在dataset中创建一个新的datatable,这个新的datatable会拥有名为customerid和companyname 列,但是datatable对象的名称是table,而不是我们希望的customers。
这个问题,可以通过添加tablemapping来解决:
string strconn="uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
strsql="select * from 表名";
sqldataadapter da=new sqldataadapter(strsql,strconn);
da.tablemappings.add("table",,"customers"); // 设置对象名称
dataset ds=new dataset();
da.fill(ds);
其实最简洁的方法是通过使用fill方法的重载,通过指定datatable,像这样:
sqldataadapter.fill(dataset,"mytablename");
这样就可以不必使用tablemappings集合。
2、在使用fill方式时,可以指定datatable,而不是dataset:
string strconn="uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
strsql="select * from 表名";
sqldataadapter da = new sqldataadapter(strsql, strconn);
datatable tbl=new datatable( );
da.fill(tbl);
3、注意打开和关闭连接的处理
在调用sqlcommand对象执行sql命令之前,需要保证与该对象关联的sqlconnection对象时打开的,否则sqlcommand的方法执行时将引发一个异常,但是我们在上面的代码中看到,sqldataadapter没有这样的要求。
如果调用sqldataadapter的fill方法,并且其selectcommand属性的sqlconnection是关闭状态,则sqldataadapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用fill方法前,sqlconnection是打开的,则查询执行完毕后,sqlconnection还将是打开的,也就是说sqldataadapter会保证sqlconnection的状态恢复到原来的情形。
这有时会导致性能问题,需要注意,例如下面的代码:
string strconn="uid=账号;pwd=密码;database=数据库;server=服务器";//sql server链接字符串
sqlconnection conn=new sqlconnection(strconn);
sqldataadapter dacustomers,daorders;
strsql="select * from customers";
dacustomers = new sqldataadapter(strsql, conn);
strsql="select * from orders";
daorders=new sqldataadapter(strsql, conn);
dataset ds=new dataset();
dacustomers.fill(ds,"customers");
daorders.fill(ds,"orders");
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!