C#中SqlDataAdapter的使用小结

转载 叁木-Neil 最后发布于2018-06-07 21:29:39 阅读数 8275 收藏

SqlDataAdapter对象

一、特点介绍
1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
二、使用介绍

1、创建SqlDataAdapter

  1. string strSQL=“Select * from Customers”;
  2. SqlCommand cmd=new SqlCommand(strSQL,cn);
  3. SqlDataAdapter da=new SqlDataAdapter();
  4. da.SelectCommand=cmd;

2、SqlDataAdapter构造函数

①string strConn=“Provider=.....”;

  1. string strSQL=“select * from Customers”;
  2. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

②string strConn=“Provider=.....”;

  1. SqlConnection cn=new SqlConnection(strConn);
  2. SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);

③string strConn=“Provider=.....”;

  1. string strSQL=“select * from Customers”;
  2. SqlConnection cn=new SqlConnection(strConn);
  3. SqlCommand cmd=new SqlCommand(strSQL,cn);
  4. SqlDataAdapter da=new SqlDataAdapter(cmd);

3、从查询中获取结果

①使用Fill方法

  1. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
  2. DataSet ds=new DataSet();
  3. da.Fill(ds); //这里ds中的表名为Table

②使用Fill方法创建DataTable对象和DataColumn对象

  1. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
  2. da.TableMapping.Add(“Table”,“Customers”);
  3. DataSet ds=new DataSet();
  4. da.Fill(ds);

③使用重载Fill方法

  1. SqlDataAdapter.Fill(DataSet,“Customers”);
  2. SqlDataAdapter.Fill(DataTable);
  3. SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);

④开放和关闭连接

如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。

  1. SqlDataAdapter daCustomers,daOrders;
  2. daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);
  3. daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
  4. DataSet ds=new DataSet();
  5. cn.Open();
  6. daCustomers.Fill(ds);
  7. daOrders.Fill(ds);
  8. cn.Close();

⑤多次调用Fill方法
    刷新DataSet中的数据,最简单的解决方法就是清空DataSet(或DataTable),然后再次调用DataAdapter对象的Fill方法。三、属性方法事件介绍 
1、属性
①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)。
②DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
③InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
④SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
⑤UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。
2、方法
①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
③GetFillParameters:为SelectCommand获取一个包含着参数的数组。
④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。
3、事件
①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。
②RowUpdated:向数据库提交一个修改的行之后被触发。

③RowUpdating:向数据库提交一个修改的行之前被触发。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SqlDataAdapter概述

SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可更改DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。

使用方法

1、通过连接字符串和查询语句

1
2
3
4
5
6
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命令

2、通过查询语句和SqlConnection对象来创建

1
2
3
4
5
6
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对象来创建

1
2
3
4
5
6
7
8
9
10
11
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();//关闭数据库

注意

如果只需要执行SQL语句或SP,就没必要用到DataAdapter ,直接用SqlCommand的Execute系列方法就可以了。sqlDataadapter的作用是实现Dataset和DB之间的桥梁:比如将对DataSet的修改更新到数据库

SqlDataAdapter的UpdateCommand的执行机制是:当调用SqlDataAdapter.Update()时,检查DataSet中的所有行,然后对每一个修改过的Row执行SqlDataAdapter.UpdateCommand ,也就是说如果未修改DataSet中的数据,SqlDataAdapter.UpdateCommand不会执行。

1、在使用Fill方式时,可以指定DataTable,而不是DataSet:

1
2
3
4
5
6
string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串   
strSql="SELECT * FROM 表名";   
    
SqlDataAdapter da = new SqlDataAdapter(strSql, strConn); 
DataTable tbl=new DataTable( ); 
da.Fill(tbl);

2、注意打开和关闭连接的处理

在调用SqlCommand对象执行sql命令之前,需要保证与该对象关联的SqlConnection对象是打开的,否则SqlCommand的方法执行时将引发一个异常,但是我们在上面的代码中看到,SqlDataAdapter没有这样的要求。

如果调用SqlDataAdapter的Fill方法,并且其SelectCommand属性的SqlConnection是关闭状态,则SqlDataAdapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用Fill方法前,SqlConnection是打开的,则查询执行完毕后,SqlConnection还将是打开的,也就是说SqlDataAdapter会保证SqlConnection的状态恢复到原来的情形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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");

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

1
2
3
4
5
6
7
8
9
10
11
12
conn.Open() 
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");
conn.Close();

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

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

C#中SqlDataAdapter的使用小结---转载的更多相关文章

  1. 梯度提升树(GBDT)原理小结(转载)

    在集成学习值Adaboost算法原理和代码小结(转载)中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boos ...

  2. windows中抓取hash小结(下)

    书接上回,windows中抓取hash小结(上) 指路链接 https://www.cnblogs.com/lcxblogs/p/13957899.html 继续 0x03 从ntds.dit中抓取 ...

  3. windows中抓取hash小结(上)

    我上篇随笔说到了内网中横向移动的几种姿势,横向移动的前提是获取了具有某些权限的用户的明文密码或hash,正愁不知道写点啥,那就来整理一下这个"前提"-----如何在windows系 ...

  4. 安装sqlserver2008中出现的问题小结

    安装完sqlserver2008时报了几个错,但是好歹装上了,但是我想使用sa用户登录,给我出现了这么一个错 标题: 连接到服务器------------------------------ 无法连接 ...

  5. Delphi中ClientDataSet的用法小结

    Delphi中ClientDataSet的用法小结 TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件.该控件封装了对数据进 ...

  6. EntityFramework中几种操作小结

    目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. 列中加入RowVersion时间戳 public class Product ...

  7. 关于 C# 中接口的一些小结

    < 关于 C# 中“接口”的一些小结 > 对于 C# 这样的不支持多重继承的语言,很好的体现的层次性,但是有些时候多重继承的确有一些用武之地.   比如,在 Stream 类 . 图形设备 ...

  8. windows server 证书的颁发与IIS证书的使用 Dapper入门使用,代替你的DbSQLhelper Asp.Net MVC中Action跳转(转载)

    windows server 证书的颁发与IIS证书的使用   最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ...

  9. C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)

    C# MVC 用户登录状态判断   来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...

随机推荐

  1. Shiro入门学习之shi.ini实现授权(三)

    一.Shiro授权 前提:需要认证通过才会有授权一说 1.授权过程 2.相关方法说明 ①subject.hasRole("role1"):判断是否有该角色 ②subject.has ...

  2. CSS-自适应网页使用@media和rem

    @media 查询 @media 媒体查询选择性加载css,意思是自动探测屏幕宽度,然后加载相应的CSS文件.可以针对不同的屏幕尺寸设置不同的样式,特别是需要设置设计响应式的页面,@media 是个不 ...

  3. 给博客页面添加 live2d 小萝莉

    添加依赖 在页脚HTML代码的地方添加下面的代码: <script src="https://eqcn.ajz.miesnfu.com/wp-content/plugins/wp-3d ...

  4. 有未经处理的异常: 0xC00000FD: Stack overflow

    将“项目属性.链接器.系统.堆栈保留大小”设大一点比如16000000 这是我在网上找到的答案,很好的解决了我的问题,忘了是哪位大神了,总之,向大神致敬

  5. JSP页面输入框赋值换行显示问题

    <input type="hidden" id="${command.yhzlId}" value="${command.yhzx },${co ...

  6. Golang介绍以及安装

    Go语言 Google开源 编译形语言 21世纪的C语言 Go语言的特点 简单易并发 开发效率高 执行性能好 Go语言应用的领域 服务端开发 日志处理 文件系统 监控服务 容器虚拟化 Docker k ...

  7. 设计模式六大原则——开放封闭原则(OCP)

    什么是开闭原则? 定义:是说软件实体(类.模块.函数等等)应该可以扩展,但是不可修改. 开闭原则主要体现在两个方面: 1.对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况. ...

  8. php海量架构

    架构 Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenCachedb 说明:我在设计系统架构时,进行了大胆的尝试,只用6台Web服务器,达到了可承受4000 ...

  9. pycharm 右键无法显示unittest框架&&解决右键只有unittest 运行如何取消右键显示进行普通run

    上面是普通文件和unittest 导入的文件右键快捷键显示情况,可以看出两者快捷键都是ctr+shift+F10,如果你是右键模式想运行unitest,但是又不知道哪里配置unittest直接运行快捷 ...

  10. Solidity高级用法

    1.内存数组: 将数组与memory结合形成内存数组,在函数调用完后就解释 uint[ ] memory values = new uint[ ](3);//初始化了一个长度为3的内存数组: #内存数 ...