当前位置:首页 > C#教程 > C#基础

C#中SqlDataAdapter的使用

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)!