SqlCommand和SqlDataAdapter的区别

SqlDataAdapter对象

一、特点介绍
1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
二、使用介绍
1、创建SqlDataAdapter
string strSQL=“Select * from Customers”;
SqlCommand cmd=new SqlCommand(strSQL,cn);
SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand=cmd;
2、SqlDataAdapter构造函数
①stringstrConn=“Provider=.....”;
string strSQL=“select * from Customers”;
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
②stringstrConn=“Provider=.....”;
SqlConnection cn=new SqlConnection(strConn);
SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);
③stringstrConn=“Provider=.....”;
string strSQL=“select * from Customers”;
SqlConnection cn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand(strSQL,cn);
SqlDataAdapter da=new SqlDataAdapter(cmd);
3、从查询中获取结果
①使用Fill方法
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
DataSet ds=new DataSet();
da.Fill(ds); //这里ds中的表名为Table
②使用Fill方法创建DataTable对象和DataColumn对象
SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
da.TableMapping.Add(“Table”,“Customers”);
DataSet ds=new DataSet();
da.Fill(ds);
③使用重载Fill方法
SqlDataAdapter.Fill(DataSet,“Customers”);
SqlDataAdapter.Fill(DataTable);
SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);
④开放和关闭连接
如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。
SqlDataAdapter daCustomers,daOrders;
daCustomers=new SqlDataAdapter(“Select * fromCustomers”,cn);
daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
DataSet ds=new DataSet();
cn.Open();
daCustomers.Fill(ds);
daOrders.Fill(ds);
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:向数据库提交一个修改的行之前被触发。

SqlCommand对象

介绍
SqlCommand对象允许你指定在数据库上执行的操作的类型。比如,你能够对数据库中的行数据执行select,insert,modify以及delete命令。SqlCommand对象能被用来支持断开连接数据管理的情况,但是在这节课我们将只单独使用SqlCommand对象。后面关于SqlDataAdapter的课程将解释如何使用断开数据实现应用程序。这节课将同时展示如何从数据库中返回一个单独的值,比如表中记录的数量。
创建SqlCommand对象
SqlCommand cmd = new SqlCommand("select CategoryName fromCategories", conn);
上面一行是典型的实例化SqlCommand对象的代码。它使用一个string参数来保存你想要执行的命令以及一个关于SqlConnection对象的引用。SqlCommand具有重载形式,这些形式你将在以后的示例中看到。
查询数据
当使用SQL的select命令,会得到一组数据集。为了和SqlCommand对象配合使用,你应该使用ExecuteReader方法,它返回一个SqlDataReader对象。我们将在后面的内容讨论SqlDataReader。下面的例子显示了如何使用SqlCommand对象来得到SqlDataReader对象:
// 1. Instantiate a new command with a query and connection
SqlCommand cmd = new SqlCommand("select CategoryName fromCategories", conn);
// 2. Call Execute reader to get query results
SqlDataReader rdr = cmd.ExecuteReader();
在上面的示例中,我们通过传递命令字符串核连接对象到构造函数的方式实体化了SqlCommand对象。然后我们通过SqlCommand对象cmd调用ExecuteReader方法得到了SqlDataReader对象。
这些代码是表1中ReadData方法的一部分,我们将在后面集中介绍。
插入数据
要对数据库插入数据,使用SqlCommand对象的ExecuteNonQuery方法。下面的代码显示了如何向数据库表插入数据:
string insertString = @"insert into Categories(CategoryName,Description)values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";
SqlCommand cmd = new SqlCommand(insertString, conn);
cmd.ExecuteNonQuery();
SqlCommand的实例化过程与以前看到的有一些区别,但是基本一致。在构造函数的第一个字符串参数中是用的是插入字符串变量而不三字符串字面值。该变量在SqlCommand声明之前被声明了。
注意在insertString文本中“doesn’’t”的两个单引号(’’)。这是将它转义为适当的单引号。
另外一个需要注意的是我们显式指明了列:CategoryName和Description。列表中有一个主键名为CategoryID。我们忽略这列因为SQL Server将自动添加此字段。试图对主键比如CategoryID添加值会产生异常。
为了执行此命令,我们简单的对SqlCommand实体cmd调用ExecuteNonQuery方法。
这段代码是表1中InsertData方法的一部分,我们将在后面集中介绍。
更新数据
ExecuteNonQuery方法同样用来更新数据。下面的代码显示了如何更新数据:
string updateString = @"update Categories set CategoryName = 'Other'
where CategoryName = 'Miscellaneous'";
SqlCommand cmd = new SqlCommand(updateString);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
删除数据
你同样能够使用ExecuteNonQuery方法删除数据。下面的例子说明了如何使用EXecuteNonQuery方法删除数据库中的记录。
string deleteString = @"delete from Categories where CategoryName ='Other'";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = deleteString;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
这个示例使用了没有参数的SqlCommand构造函数。取而代之的是显式地设置了CommandText和SqlCommand对象的连接属性。
我们同样能够使用SqlCommand构造函数在前面的两个重载形式——用来插入或者更新命令——得到相同的结果。它说明了在任何时候既能够改变命令文本又能够改变连接对象。
ExecuteNonQuery方法调用将命令传递给数据库。
得到单一值
某些时候你想从数据库中只取一个值,它可能是关于数据集的计数、和、平均值或者其他聚合数值。使用ExecuteReader方法并计算代码中的结果并不是做这些事情的有效方式。最好的选择就是让数据库能够执行并且只返回你所需要的单独的值。下面的示例说明了如何使用ExecuteScalar方法来实现:
SqlCommand cmd = new SqlCommand("select count(*) from Categories",conn);
int count = (int)cmd.ExecuteScalar();
总结
SqlCommand对象允许你擦许并对数据库传送命令。它含有针对不同的命令而特定的方法。ExecuteReader方法返回SqlDataReader对象来现实查询的结果。对于insert,update以及delete这些SQL命令,使用ExecuteNonQuery方法。如果你只需要查询的单独聚集值,ExecuteScalar方法是最好的选择

SqlDataAdapter和SqlCommand对比分析

一、SqlDataAdapter和DateSet

原理:DateSet是数据的内存驻留表示形式,它提供了独立于数据源的一致关系编程模型;从某种程度上说DateSet就是一个不可视的数据库。但真正与数据源打交道的是SqlDataAdapter,包括从数据源填充数据集和从数据集更新数据源。SqlDataAdapter使用Fill()方法将检索的数据填充到 DateSet。

流程:IE——GridView——DataSet——SqlDataAdapter——SQL数据库

public void BindGrid()

{

SqlDataAdapter myAdp = new SqlDataAdapter("select * fromUserAdmin order by UserId desc", conn);

DataSet ds = new DataSet();

myAdp.Fill(ds, "Authors");

//Label1.Text = ds.Tables[0].Rows.Count.ToString(); //得到共有多少条记录;

GridView1.DataSource =ds.Tables["Authors"].DefaultView;

GridView1.DataBind();

}

二、SqlCommand和SqlDataReade

原理:SqlCommand通过ExecuteReader()方法将得到的数据给SqlDataReade对象。

SqlDataReade逐行将从数据源获得的数据放进缓冲区进行处理。

优点:SqlDataReade执行速度快,提高应用程序性能。

优点原因:一旦数据可用,SqlDataReade就会立即检索该数据,而不是等待返回查询的全部结果;默认情况下,一次只在缓冲区存储一行,从而降低系统开销。

缺点:使用不灵活。

流程:IE——SqlDataReade——SqlCommand——SQL数据库

注:每次使用完SqlDataReade对象后一定要调用Close()方法将其关闭。因为SqlDataReade对象以独占的方式使用Connection。

例:

SqlCommand myconn = new SqlCommand("select * fromv_economy2_comidd where eid=" + Request.QueryString["eid"] +"", conn);

conn.Open();

SqlDataReader rd = myconn.ExecuteReader();

rd.Read();

Lbyear1.Text = rd["year1"].ToString();

Lbmonth1.Text = rd["month1"].ToString();

Lbcom_name.Text = rd["com_name"].ToString();

rd.Close();

conn.Close();

区别在于:

理解一:

SqlDataAdapter一般用于查询是非连状态,所以没有open() 和close()直接将数据fill到dataset中.

SqlCommand一般是连接状态,需要数据库open()和close()

SqlCommand  一般用于非查询.(也可用于查询)

SqlDataAdapter针对多条记录或数据容器进行更新,比如DataSet,DataTable,等,内部调用 对于的SqlCommand(Update,Insert,Delete)
SqlCommand针对 单条记录进行数据更新。

理解二:

DataSet是读表用的 一般都要SqlDataAdapter
SqlCommand是在用来写SQL执行命令的

SqlDataAdapter:
用于填充 DataSet 和更新 SQL 数据库的“一组”数据命令和“一个”数据库连接。
SqlDataAdapter不但可以操作多个SQL命令,而且还可以操作一个SQL命令

DataSet是关系型数据库的抽象,ADO.NET使用DataAdapter(意为数据适配器)作为dataset和数据源之间的桥梁;DataAdapter 提供了Fill()方法从数据库中获取数据并生成DataSet。
SqlCommand:
对 SQL 数据库执行的“一个”SQL语句或存储过程。
SqlCommand只能操作一个SQL命令

个人觉得SqlCommand用来更新少量数据时比较合适,速度快,使用方便。他是执行sql语句查询的。
SqlDataAdapter用于把数据放到DataSet中,集中修改、删除后,通过Update把整个DataSet再提交回给数据库进行处理

转载于:https://www.cnblogs.com/xiaoyaohan/p/9835254.html

SqlDataAdapter与SqlCommand之间的区别相关推荐

  1. FPGA与ASIC:它们之间的区别以及使用哪一种?

    FPGA与ASIC:它们之间的区别以及使用哪一种? FPGA Vs ASIC: Differences Between Them And Which One To Use? VL82C486 Sing ...

  2. Python 应用领域以及版本之间的区别

    Python 应用领域以及版本之间的区别 一.Python应用领域 Python+人工智能,给你更多研究方向选择! 企业级综合实战项目,集六大前沿技术为一体 二. Python 2与Python 3的 ...

  3. java中separator_java - File.separator和路径中的斜杠之间的区别

    java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...

  4. 机器学习、数据科学、人工智能、深度学习和统计学之间的区别!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Vincent Granville,来源:机器之心 在这篇文章中, ...

  5. Python里面None True False之间的区别

    None虽然跟True False一样都是布尔值. 虽然None不表示任何数据,但却具有很重要的作用. 它和False之间的区别还是很大的! 例子: >>> t = None > ...

  6. 2.javascript之缓存 localStorage 和sessionStorage之间的区别

    2018-08-04 前言 今天做项目的时候遇到了这个问题,用户登录成功之后如何改变将登录的链接切换为用户名 解决方案:使用了sessionstorage缓存 和js的onload加载事件 用户登录成 ...

  7. java se 与j2se_关于java:J2EE和J2SE项目之间的区别

    本问题已经有最佳答案,请猛点这里访问. 我已经从github下载了一个开源项目. 这是一个基于Maven的项目. 我如何理解该项目是J2SE项目还是J2EE项目? 这两种项目在结构上有何不同? Jav ...

  8. oracle类型sql转为mysql_Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)...

    >本篇博文是Oracle和MySQL之间的等效SQL转换和不同,目前市面上没有转换两种SQL的工具,小编觉得以后也不一定会有,于是在业余时间整理了一下,如果有什么错误之处请留言告知,小编也是刚 ...

  9. 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了)

    title: 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了) tags: 面试常见题 腾讯面试题:char 和 varchar的最大长度是 ...

最新文章

  1. (2017)第八届蓝桥杯大赛个人赛省赛(软件类) C/C++ 大学A组 题解(第八题包子凑数)
  2. Amazon AWS云计算服务平台概述
  3. mysql group by怎么用
  4. 【转】Java MySQL数据类型对照
  5. outerDocument访问外部属性方法
  6. ubuntu16.04源码安装python3.7
  7. 椭圆极点极线性质_笔记:关于极点极线的一些思考
  8. 数学建模 员工指派问题 Lingo求解优化问题
  9. DP1363F国产NFC射频前端芯片替代CLRC663/RC522
  10. 还原html默认打开方式,Win7旗舰版64位系统下如何还原文件默认打开方式
  11. 【Linux】FirefoxBrowser 火狐浏览器安装 FlashPlayer 插件
  12. Flutter2.5新特性 中文版
  13. excel宏 java,Microsoft Excel宏运行Java程序
  14. 鸡和兔子若干只,头有35个,脚有94个,求兔子和鸭个多少只
  15. 一键安装mysql5.7
  16. submit 编写python代码
  17. 找工作的一些感悟——前端小菜的成长
  18. STM32学习之CAN控制器简介
  19. C++:计算对称正定 (SPD) 矩阵的逆矩阵(附完整源码)
  20. [转载]JS浏览器兼容性问题

热门文章

  1. Java工作小组组名,小组合作组名组训组号
  2. linux修改文件/目录所属的用户和组
  3. 【ASP.NET MVC4】第八课:MVC数据验证、验证特性、自定义验证
  4. SharePoint Integrator Delphi版
  5. 微软IE8浏览器使用评测
  6. 微信小程序tab导航+滚动顶部吸附效果(开发实例)
  7. java越野拉力赛_BZOJ 4244 邮戳拉力赛 (DP)
  8. 给图片加一个黑色半透明的遮盖层
  9. 如何计算excel中单元格里面字符的个数
  10. 解决:error: Libtool library used but 'LIBTOOL' is undefined