ADO.NET入门教程(七) 谈谈Command对象高级应用

摘要

在上一篇文章《你必须知道的ADO.NET(六) 谈谈Command对象与数据检索》中,我详细讲解了Command对象的基础知识以及基本用法。作为ADO.NET中最具执行力的对象,Command对象实属变幻莫测。在本文中,我将与大家一起探讨Command对象的高级应用与技巧。


目录


1. 异步执行命令

在ADO.NET 2.0版本之前,执行Command对象命令时,需要等待命令完成才能执行其他操作。比如,执行ExcuteNonQuery()方法,应用程序将会保持阻塞,直到数据操作成功完成或者异常终止以及连接超时。在ADO.NET 2.0版本引入异步执行特性,显然,ADO.NET更稳健,更完美了。

异步执行的根本思想是,在执行命令操作时,无需等待命令操作完成,可以并发的处理其他操作。ADO.NET提供了丰富的方法来处理异步操作,BeginExecuteNonQuery和EndExcuteNonQuery就是一对典型的为异步操作服务的方法。BeginExecuteNonQuery方法返回System.IAsyncResult接口对象。我们可以根据IAsyncResult的IsCompleted属性来轮询(检测)命令是否执行完成。还是来看一个简单的实例把!这个实例采用了《你必须知道的ADO.NET(六) 谈谈Comand对象与数据检索》中的数据库和数据表。在这个实例中,我们将在tb_SelCustomer中插入500行数据,并计算执行时间。代码如下:

处理结果如下:

2. 请使用参数化查询

在ADO.NET中,查询语句是以字符串的形式传递给外部数据库服务器的。这些字符串不仅包含了基本命令关键字,操作符,还包含了限制查询的数值。与其他编程语言不同,.NET是基于强类型来管理查询字符串数据的。通过提供类型检查和验证,命令对象可使用参数来将值传递给 SQL 语句或存储过程。 与命令文本不同,参数输入被视为文本值,而不是可执行代码。 这样可帮助抵御“SQL 注入”攻击,这种攻击的攻击者会将命令插入 SQL 语句,从而危及服务器的安全。参数化命令还可提高查询执行性能,因为它们可帮助数据库服务器将传入命令与适当的缓存查询计划进行准确匹配。

对于不同的数据源来说,Parameter对象不同,但都派生自DbParameter对象。下表列举了不同数据源对应的Parameter对象。

数据提供程序                                       对应Paramter对象                                                            命名空间                                                                                                                  
SQLServer 数据源                            使用SqlParamter对象 System.Data.SqlClient.SqlParameter
Ole DB 数据源 使用OleDbParameter对象 System.Data.OleDb.OleDbParameter
ODBC 数据源 使用OdbcParamter对象 System.Data.Odbc.OdbcParameter
Oracle数据源 使用OracleParameter对象 System.Data.OracleClient.OracleParameter

Paramter对象的属性很多,其中常见而且非常重要的主要有以下几个:

  • DbType: 获取或设置参数的数据类型。
  • Direction: 获取或设置一个值,该值指示参数是否只可输入、只可输出、双向还是存储过程返回值参数。
  • IsNullable: 获取或设置一个值,该值指示参数是否可以为空。
  • ParamteterName: 获取或设置DbParamter的名称。
  • Size: 获取或设置列中数据的最大大小。
  • Value: 获取或设置该参数的值。

以SQL Server为例,SqlCommand对象包含一个Paramters集合,Paramters集合中包含了所有所需的SqlParamter对象。当执行命令时,ADO.NET同时将SQL文本,占位符和参数集合传递给数据库。

提示: 对于不同的数据源来说,占位符不同。SQLServer数据源用@parametername格式来命名参数,OleDb以及Odbc数据源均用问号(?)来标识参数位置,而Oracle则以:parmname格式使用命名参数。

下面我们看一个实例,修改 测试顾客1 的基本信息。修改的基本信息如下:

  1. 电话号码(Phone):18665691100
  2. 电子邮箱(Email):[email protected]
  3. 地址(ContactAddress):中国深圳市南山区

代码如下:

看了上面的代码不知大家有何感想,是否觉得太多繁琐呢?的确,我们可以用更简洁的方法来实现。具体方法是,我们可以先构造Parameter对象数组,然后遍历添加到Command对象的Paramters集合中。代码如下:

上面两种写法,结果完全相同。查询数据库,我们可以得到以下结果:

3. 如何获取插入行的ID?

很多时候,我们需要知道插入行的ID是多少,以方便我们进行利用插入行的ID进行其他操作,比如在页面上的展示等等。当然实现的方法有很多种,比如利用C#的out修饰符修饰参数,我更倾向于用SQL Server数据库原生的OUTPUT关键字。OUTPUT关键字返回INSERT操作的一个字段(一般是主键ID)。因此我们只要结合OUTPUT关键字以及ExecuteScalar方法,就很容易得到插入行的主键。还是看一个简单的实例把!我们在tb_SelCustomer中插入一个新的顾客,并返回这个顾客的ID。代码如下:

运行结果如下:

4. 总结

简言之,Command对象的核心作用是执行命令。在执行命令过程中,面临的情况是十分复杂的。尽管如此,Command对象拥有优越的人力资源(属性和方法),来应对一切可能发生的事。可以说,Command对象的稳定发挥,为ADO.NET打下了扎实的根基。到目前为止,我们基本上了解ADO.NET DataProvider组件所有的内容。因此,后面我将重点讲述ADO.NET的心脏----DataSet以及如何将数据源本地化。另外,我非常期待能得到您的推荐和关注。

文章转载于:http://liuhaorain.cnblogs.com

时间: 2024-09-29 23:49:47

ADO.NET入门教程(七) 谈谈Command对象高级应用的相关文章

ADO.NET入门教程(六) 谈谈Command对象与数据检索

摘要 到目前为止,我相信大家对于ADO.NET如何与外部数据源建立连接以及如何提高连接性能等相关知识已经牢固于心了.连接对象作为ADO.NET的主力先锋,为用户与数据库交互搭建了扎实的桥梁.它的一生是平凡而又伟大的,总是尽自己最大的努力为用户搭建一条通往数据库的平坦大道.相比连接对象来说,Command对象似乎耀眼的多.Command对象在ADO.NET世界里总是忙忙碌碌,它就像一个外交官,为用户传达了所有操作数据库的信息. 目录 准备 什么是Command对象? 必须掌握的几个属性 必须掌握的

无废话ExtJs 入门教程七[登陆窗体Demo:Login]

无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 &l

RabbitMQ入门教程(七):主题交换机Topics

原文:RabbitMQ入门教程(七):主题交换机Topics 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78631035 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 本节主要演示交换机的另一种类型:主题类型topic,直连接类型direct必须是生产者发布消息指定的routingKey和消费者

ADO.NET入门教程(二)了解.NET数据提供程序

摘要 在上一篇文章<你必须知道的ADO.NET(一) 初识ADO.NET>中,我们知道ADO.NET的两大核心组件分别是Data Provider和DataSet.如果说DataSet是ADO.NET的心脏,那么Data Provider绝对是ADO.NET的左臂右膀.Data Provider提供了访问外部数据数据源的可能性,而且外部的数据源是多样的.本文将详细说明.NET数据提供程序的作用以及如何访问不同的数据源. 目录 什么是.NET数据提供程序? .NET数据提供程序的核心对象 其他重

ADO.NET入门教程(一) 初识ADO.NET

摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分. 目录 什么是ADO.NET? 理清ADO.NET与ADO的关系 认识ADO.NET最核心的组成部分 ADO.NET扩展 1. 什么是ADO.NET? 简单的讲,ADO.NET是一组允许.NET开发人员使用标准的,结构化的,甚至无连接的方式与数据交互的技术.对于ADO.NET来说,可以处理数据源是

ADO.NET入门教程(八) 深入理解DataAdapter(上)

摘要 ADO.NET有两个核心组件:基于连接的Data Provider组件以及基于非连接的DataSet组件.基于连接的Data Provider组件常用于实时地从数据库中检索数据.而基于非连接的DataSet,似乎与数据库没有直接联系,仅仅用于在本地内存中存储Data Provider提供的数据表或集合.这一切似乎很微妙,此时,你是否在想:这两大组件是如何联系在一起的呢?或许,通过阅读本文会或多或少解除你的一些疑惑呢! 目录 认识DataAdapter DataAdapter的工作原理 说说

ADO.NET入门教程(五) 细说数据库连接池

题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没有.撇开文章质量不讲,必须肯定的是,我是用心去写每一篇文章的.无论是是在排版上,还是在内容选取上我都花了不少心思.我希望通过本系列文章,无论是新手还是老手,在ADO.NET上都能有所收获.如果大家觉得有帮助,我希望能得到您的推荐和关注,让我知道您对我的肯定.如果大家觉得我写的不好,我也很乐意听取批评的意见,让我们一起进步. 摘要 今天我要讲的是数据库连接池.说实话,我表示鸭梨很大.因为相比其他章节来说,连接池相对来说难理解一点.

ADO.NET入门教程(四) 品味Connection对象

摘要 前几篇文章,我都没有详细讲解Data Provider核心对象,因为我希望在讲解这些对象之前,让大家对一些基础的概念有很好的认识.在上一篇文章<你必须知道的ADO.NET(三) 连接字符串,你小觑了吗>中,我详细讲解了连接字符串,相信大家都和我一样意识到它的重要性了.如果说连接字符串是打开数据源大门的钥匙,那么我今天要讲解的则是如何用这把钥匙打开数据源的大门.作为Data Provider的第一核心对象,Connection对象肩负起连接数据源的重任.下面就让我们好好认识这位重量级人物吧

ADO.NET入门教程(三) 连接字符串,你小觑了吗?

摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问.在上一篇文章<你必须知道的ADO.NET(二)了解.NET数据提供程序>中,我们知道.NET对不同数据源,使用不同的数据提供程序,这使得我们可以更高效的访问相应的数据源.除了.NET数据提供程序外,我还得说说另外一位功臣:连接字符串(Connection Strings),它也为ADO.NET在解决"不同"与"一致"的矛盾中,贡献出了非常重要的力量. 目录 什么是连接字符串? 理解语法格式