ADO.NET概述

本节复习如何使用ADO.NET访问C#程序中的数据,主要介绍如何使用SqlConnection类和OleDbConnection类连接数据库,以及断开与数据库连接。深入讨论命令对象的各种选项,并说明如何为sql类和OleDB类的每个选项使用命令。如何使用命令对象来调用存储过程,这些存储过程的结果如何集成到缓存的客户端上的数据中。

介绍ADO.NET

ADO.NET比现在有的API在技术上高出很多。它与ADO仅仅是名称类型,类和访问数据的方法完成不同。

ADO(ActiveX Data Objects)是一个COM组件库,ADO主要包含Connection、Command、Recordset、Field对象。使用ADO时,要打开与数据库的连接,选择一些数据,并把它们放在记录集合中,这些记录集由字段组成,最后关闭联系。

ADO还引入:断开连接的记录集,当不适合使用连接打开相当长的时间时,就可以使用这个。

ADO.NET使用由ADO升级而来。并附带3个数据库客户端名称空间。

  1. 用于SQL Server
  2. 用于ODBC数据源
  3. 用于通用的OLE DB实现的数据库

如果数据库是不SQL Server,就应该在线搜索一个专门的.NET提供程序,找不到就应该使用OLE DB.

命名空间

下图显示了.NET数据访问中使用的类和接口命名空间。

共享类

ADO.NET包含许多类,无论是使用SQL Server类还是使用OLE DB类,都可以使用它们。命名空间是System.Data.

数据库专用类

除了共享类之外,ADO.NET还包含许多数据库专用类。这些类实现一组在System.Data命名空间对应的标准接口,根据需要允许类按照一般形式来使用。如SqlConnection类和OleDbConnection类都是派生与实现了IDbConnection接口的DbConnection类。

// 摘要:
// 表示 SQL Server 数据库的一个打开的连接。此类不能被继承。
[DefaultEvent("InfoMessage")]
public sealed class SqlConnection : DbConnection, ICloneable // 摘要:
// 表示到数据源的连接是打开的。
[DefaultEvent("InfoMessage")]
public sealed class OleDbConnection : DbConnection, ICloneable, IDbConnection, IDisposable

其他专用类如下:

ADO.NET类最重要的功能是:它是以断开连接的方式工作。特别适合Web为中心环境。传统的ADO2.1引入断开连接的记录集,但是由于不是一开始就设计好,不如ADO.NET完善。

使用数据库连接

为了访问数据库,需要提供某种连接参数,如运行数据库的计算机和登录证书。ADO.NET连接类是OleDbConnection和SqlConnection。类的层次结构如下

代码示例

 using System.Data.SqlClient;
string strConn = "Data Source=****;Initial Catalog=***;User Id=sa;Password=****;";
SqlConnection conn = new SqlConnection();
conn.ConnectionString = strConn;
conn.Open();
//做一些事情 conn.Close();

管理连接字符串

在以前的版本中,由开发人员管理数据库连接字符串,其方法是把连接字符串存储在应用程序配置文件中,或者直接硬编码连接字符串。

.NET2.0开始,有一种预定义的方式存储连接字符串,要定义数据库连接字符串,应该使用配置文件中部分,在这边指定连接的名称、数据库连接串的实际参数,还需要指定这个连接类型的提供程序。

<connectionStrings>
<add name="ADOTest" providerName="System.Data.SqlClient"
connectionString="Data Source=***;Initial Catalog=***;User Id=sa;Password=**;" />
</connectionStrings>

程序中读取数据库连接的方法示例:

  private static DbConnection GetDatabaseConnenction(string name)
{
ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[name];
DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = settings.ConnectionString;
return conn;
}

这对应获取数据库连接似乎是不必要的工作,如果应用程序从来不运行在其他数据库上,这些工作的确没有必要,但是使用签名的工厂方法和泛型Db*类,就会发现以后将应用迁移到另一个数据库系统上非常简单方便。

高效地使用连接

一般情况下,当在使用“稀缺”的资源是,如数据库连接、窗口,最好确保每个资源使用完成立刻关闭,尽管有自动垃圾回收,但还是尽早释放资源,避免出现资源的匮乏的情况。下面介绍两种方式确保数据库连接等类似“稀缺”资源在使用后立即释放。

  1. 第一种方式----利用try...catch...finally,确保在finally块中关闭任何打开的连接。
  2. 第二种方式---使用using语句块

在using语句块中无论块是如何退出的,using子句都会确保关闭连接。在编程时,应至少使用两种方法中的一种,或者两种方法都使用,最好是组合使用这个两种方法。

事务

对数据库要进行多次更新,这些更新必须在事务的范围内进行。我们常常要在代码中查找一个事务对象,它传递给许多方法,以便更新数据库。

2.0以后在System.Transacions程序集中添加了TransactionScope类,简化了事务代码的编写,可以把几个事务方法合并到一个事务范围中。

在事务作用域中,可以选择在该事务中执行命令的独立级别,该级别确定了如何在一个数据库会话中查看在另一个数据会话中所进行的修改,并不是所有数据库都支持。

这个节比较难懂,一般不会这样使用事务的,会使用数据库事务。

命令

命令就是一个要在数据库上执行包含SQL语句的问题吧字符串,也可以是一个存储过程。

把SQL子句作为一个参数传递给Command类的构造函数,就可以构造一条命令。

<provider>Command类有一个CommandType属性,它用来定义某条命令是SQL子句、存储过程还是完整的表语句。

执行命令

定义好命令后,就需要执行它,执行语句有许多方式,这取决于要从命令中返回什么数据。

<provider>Command类提供了如下执行命令:

  • ExecuteNonQuery()--执行命令,但返回影响的行数。
  • ExecuteReader()--执行命令,返回一个类型化的IDataReader
  • ExecuteScalar()--执行命令,返回结果集中的第一行第一列的值。

sqlCommand类提供了下面方法:

  • ExecuteXmlReader()---执行命令,返回一个XmlReader对象,它可以遍历从数据库返回的xml片段。

ExecuteNonQuery()方法

这个方法一般用于update、insert、delete语句,其中唯一的返回值是受影响的行数,但如果调用带输出参数的存储过程,该方法就有返回值了。

ExecuteReader()方法

这个方法执行命令,并根据使用的提供程序返回一个类型化的DataReader对象,返回的对象可以用于遍历返回的记录。

ExecuteScalar()方法

这个方法执行命令,需要从SQL语句返回一个结果,该返回一个对象,根据需要可以把对象强制转换为合适的类型。

调用存储过程

用命令对象调用存储过程,就是定义存储过程的名称,给过程的每个参数参数定义。

调用没有返回值的存储过程

CommandType.StoredProcedure

Command.Parameters 添加参数

执行使用ExecuteNonQuery

调用返回参数的存储过程

CommandType.StoredProcedure

Command.Parameters 添加输出参数

执行使用ExecuteNonQuery

如果返回的不是一个参数而是一组记录行,应该调用ExecuteReader方法。遍历所有返回记录。

参考图书《C#高级编程》

ADO.NET温习(一)的更多相关文章

  1. 我的Android进阶之旅------>温习Sqlite3的常用操作

    前言;今天要写一个应用来调节系统的Brightness值,来改变系统的背光亮度.由于刚开始些的时候没有考虑Brightness的最小值,直接托动SeekBar到最小值(为0).瞬间,屏幕变成全黑,失败 ...

  2. 前端框架 EasyUI (0) 重新温习(序言)

    几年前,参与过一个项目.那算是一个小型的信息管理系统,BS 结构的,前端用的是基于 jQuery 的 EasyUI 框架. 我进 Team 的时候,项目已经进入开发阶段半个多月了.听说整个项目的框架是 ...

  3. ADO.NET对象的详解

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

  4. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  5. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  6. ADO.NET一小记-select top 参数问题

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...

  7. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  8. 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你

    目前我们所接触到的许多项目开发,大多数都应用了 ORM 技术来实现与数据库的交互,ORM 虽然有诸多好处,但是在实际工作中,特别是在大型项目开发中,容易发现 ORM 存在一些缺点,在复杂场景下,反而容 ...

  9. ADO.NET Entity Framework 在哪些场景下使用?

    在知乎回答了下,顺手转回来. Enity Framework已经是.NET下最主要的ORM了.而ORM从一个Mapping的概念开始,到现在已经得到了一定的升华,特别是EF等对ORM框架面向对象能力的 ...

随机推荐

  1. 关于Node.js后端架构的一点后知后觉

    前言 上周有幸和淘宝前端团队的七念老师做了一些NodeJS方面上的交流(实际情况其实是他电话面试了我╮(╯-╰)╭),我们主要聊到了我参与维护的一个线上NodeJS服务,关于它的现状和当下的不足.他向 ...

  2. asp.net权限认证:HTTP基本认证(http basic)

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  3. list_删除元素

    项目遇到了题目所述的问题,还是折腾了一会... 现在总结一下: 这里写一个测试小程序: List<Integer> ints = new ArrayList<Integer>( ...

  4. c#.net的网站出现“正在中止线程””异常的原因和解决方法

    出现“正在中止线程”异常通常都是由于以下三种原因导致引起,给出解决方案如下: 解决方案: 1.针对Response.End,调用 HttpContext.Current.ApplicationInst ...

  5. synchronized的使用及注意事项

    主要来源:http://blog.csdn.net/luoweifu/article/details/46613015 1.synchronized(this) void method(){ sync ...

  6. java线程之多个生产者消费者2.0

    上一节中,通过while和notifyAll解决了多个生产者,消费者对共享资源的访问问题,现在开始升级 但是,仍然有改进之处,主要体现在两点: 1)使用新版本1.5开始后的锁Lock解决,目的将其全部 ...

  7. SpringMVC总结的部分教程及使用方法

    注:本文只用注解来实现 SpringMVC各种流程图流程图(其他的各种流程图)jsp.xml.action彼此之间的关系,都如何使用spring-mvc.xml如何配置,放在哪里?action中如何转 ...

  8. JavaScript实现按键精灵

    最近有个需求,需要在页面上面自动点击.输入.提交. 用以模拟真实用户的操作行为,可以通过直接执行某个元素绑定的事件,来执行操作. 也可以创建事件,再派发事件,执行操作.关于事件的更多细节,可以参考&l ...

  9. AMD的cpu如何安装Mac OS

    AMD的cpu如何安装Mac OS       经过一个月的折腾,终于成功的安装了自己的Mac系统,并且能够成功的启动.在这里分享一下自己安装的经验.      为了安装方便,有不影响原来的系统的使用 ...

  10. iOS上传代码到Github平台

    对于开发人员来说,很多时候想把自己好的代码 demo放到一个公共平台,与大家交流,Github就是一个不错的平台,下面给大家说说Github的具体使用方法. 第一步.申请Github账号.https: ...