1、SqlDataAdapter内部通过SqlDataReader获取数据,而默认情况下SqlDataReader不能获知其查询语句对应的数据库表名,所以下面的代码:

string strConn,strSQL;

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

strSql="SELECT CustomerID,CompanyName FROM Customers";

SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

DataSet ds=new DataSet();

da.Fill(ds);

会在DataSet中创建一个新的DataTable,这个新的DataTable会拥有名为CustomerID和CompanyName 列,但是DataTable对象的名称是Table,而不是我们希望的Customers。

这个问题,可以通过添加TableMapping来解决:

string strConn,strSQL;

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

strSql="SELECT CustomerID,CompanyName FROM Customers";

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,strSQL;

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

strSql="SELECT CustomerID,CompanyName FROM Customers";

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,strSQL;

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

SqlConnection cn=new SqlConnection(strConn);

SqlDataAdapter daCustomers,daOrders;

strSql="SELECT CustomerID,CompanyName FROM Customers";

daCustomers=new SqlDataAdapter(strSql,cn);

strSql="SELECT OrderID,CustomerID,OrderDate  FROM Orders";

daOrders=new SqlDataAdapter(strSql,cn);

DataSet ds=new DataSet();

daCustomers.Fill(ds,"Customers");

daOrders.Fill(ds,"Orders");

以上代码会导致连接被打开和关闭两次,在调用Fill方法时各一次。为了避免打开和关闭SqlConnection对象,在调用SqlDataAdapter对象的Fill方法之前,我们可以先打开SqlConnection对象,如果希望之后关闭连接,我们可以再调用Close方法,就像这样:

cn.Open();

daCustomers.Fill(ds,"Customers");

daOrders.Fill(ds,"Orders");

cn.Close();

4、多次调用Fill方法需要注意数据重复和有效更新数据的问题

string strConn,strSQL;

strConn=@"Data Source=.\SQLEXPRESS;"+"Initial Catalog=Northwind;Integrated Security=True;";

strSql="SELECT CustomerID,CompanyName FROM Customers";

SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

DataSet ds=new DataSet();

da.Fill(ds,"Customers");

…….

da.Fill(ds,"Customers");

我们分析上面的代码,通过两次调用Fill方法,SqlDataAdapter执行两次查询,并两次将查询结果保存到DataSet中,第一次调用在DataSet中创建了一个名为Customers的新表。第二次调用Fill方法将查询的结果追加到DataSet中的同一个表中,因此,每个客户的信息将在DataSet中出现两次!当然,如果数据库管理员对Customers表定义了主键,则SqlDataAdapter在天成DataTable时,会判断重复行,并自动丢弃掉旧的值。

考虑一下,假定一个特定客户在第一次调用Fill方法时,存储于数据库中,那么SqlDataAdapter会将其添加到新建的DataTable中。如果后来这个客户被删除了,那么第二次调用Fill方法时,SqlDataAdapter将不会在查询结果中找到该客户信息,但是它也不会将客户信息从DataSet中删除。这就导致了数据更新的问题。

所以推荐的做法是,在调用Fill方法前,先删除本地DataSet中缓存的数据!

摘自:http://www.cnblogs.com/ajiefj/archive/2010/03/15/1686064.html

使用SqlDataAdapter时,需要注意的几点的更多相关文章

  1. SqlDataAdapter概述

    SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据.SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它 ...

  2. ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系

    Connection: 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是 ...

  3. C#中SqlDataAdapter的使用小结---转载

    C#中SqlDataAdapter的使用小结 转载 叁木-Neil 最后发布于2018-06-07 21:29:39 阅读数 8275 收藏 展开 SqlDataAdapter对象 一.特点介绍1.表 ...

  4. ADO.NET 快速入门(五):从 DataSet 更新数据库

    该主题说明了如何使用 DataSet 在数据库中更新数据.你依然可以直接使用 SqlCommand 在数据库中插入.更新.和删除数据,记住这一点也很重要.理解“从数据库填充DataSet”涵盖的概念有 ...

  5. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  6. 从 Paxos 到 ZooKeeper

    分布式一致性 分布式文件系统.缓存系统和数据库等大型分布式存储系统中,分布式一致性都是一个重要的问题. 什么是分布式一致性?分布式一致性分为哪些类型?分布式系统达到一致性后将会是一个什么样的状态? 如 ...

  7. 使用 jQuery Ajax 在页面滚动时从服务器加载数据

    简介 文本将演示怎么在滚动滚动条时从服务器端下载数据.用AJAX技术从服务器端加载数据有助于改善任何web应用的性能表现,因为在打开页面时,只有一屏的数据从服务器端加载了,需要更多的数据时,可以随着用 ...

  8. SqlDataReader和SqlDataAdapter

    SqlDataReader 高效,功能弱,只读访问SqlDataAdapter 强大,要求资源也大一点 SqlDataReader 只能在保持跟数据库连接的状态下才可以读取... SqlDataAda ...

  9. 使用SqlDataReader和SqlDataAdapter的注意

    1.当SqlDataReader没有关闭之前,数据库连接会一直保持open状态,所以在使用SqlDataReader时,使用完毕应该马上调用SqlDataReader.Close()关闭它. 2.一个 ...

随机推荐

  1. css 盒模型相关样式

    话不多说,一切还是从最基础的说起.  盒的类型  1.盒的基本类型 在css中,用display定义盒的类型,一般分为block类型与inline类型. 例如div属于block类型,span属于in ...

  2. 使用iTextSharp来填充PDF模板文件

    需求简介:     遇到了这样一个需求:某公司需要为所有用户的培训生成一个培训记录,过程如下:     (1)用户在培训完之后会进入到一个填写信息的界面.     (2)用户填写信息.     (3) ...

  3. ubuntu(16.04.01)学习-day2

    1.建立硬链接: ln main.c mainsoft 2.建立软链接:ln -s main.c soft 3.对文档进行统计 wc main.c返回行.单词数和字符数 4.查看相应命令的描述 wha ...

  4. TSQL基础(一) - 查询

    select 1.查询一张表(orders)的所以纪录 select * from Orders 2.查询一张表(orders)某字段的所有记录 select OrderID,OrderDate fr ...

  5. C#学习笔记之线程 - 高级主题:非阻塞同步

    非阻塞同步 - Nonblock Synchronization 前面提到,即使在简单的赋值和增加一个字段的情况下也需要处理同步.尽管,使用锁可以完成这个功能,但是锁必定会阻塞线程,需要线程切换,在高 ...

  6. js中元素操作的有关内容与对比

    以下 A:代表原生js B:代表jQuery 1 创建元素/节点 A: 元素节点- createElement( ) 文本节点 - createTextNode() 例如: var a = docum ...

  7. 【转载】Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载六)Linux的网络配置

    本篇是Linux小白最佳实践第6篇,目的就是让白菜们了解Linux网络是如何配置的.Linux系统在服务器市场占有很大的份额,尤其在互连网时代,要使用计算机就离不开网络. 想每天能听到小妞的语音播报, ...

  8. blazeDS集成spring的remote访问

     欢迎交流转载,请注明出处:http://www.cnblogs.com/shizhongtao/p/3490037.html 上一篇我只是简单实用blazeds创建了一个实例,大多数开发中,都是结合 ...

  9. 怎样在Android SDK 下查看应用程序输出日志的方法

          该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...

  10. Windows Phone 为指定容器内的元素设置样式

    在Windows Phone中设置元素样式有多种 拿TextBlock来说 1.我们可以直接在控件上设置: <TextBlock Text="自身样式设置" Width=&q ...