出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/11/2346312.html

1. 什么是.NET数据提供程序?

.NET Framework数据提供程序用于连接数据库、执行命令和检索结果。这些结果将被直接处理,放置在 DataSet 中以便根据需要向用户公开、与多个源中的数据组合,或在层之间进行远程处理。.NET
Framework 数据提供程序是轻量的,它在数据源和代码之间创建最小的分层,并在不降低功能性的情况下提高性能。

下表列出了 .NET Framework 中所包含的数据提供程序。

.NET数据提供程序

说明

用于 SQL Server 的数据提供程序

提供对 Microsoft SQL Server 7.0 或更高版本中数据的访问。使用 System.Data.SqlClient 命名空间。

用于 OLE DB 的数据提供程序

提供对使用 OLE DB 公开的数据源中数据的访问。使用 System.Data.OleDb 命名空间。

用于 ODBC 的数据提供程序

提供对使用 ODBC 公开的数据源中数据的访问。使用 System.Data.Odbc 命名空间。

用于 Oracle 的数据提供程序

适用于 Oracle 数据源。用于 Oracle 的 .NET Framework 数据提供程序支持 Oracle
客户端软件 8.1.7 和更高版本,并使用System.Data.OracleClient 命名空间。

EntityClient 提供程序

提供对实体数据模型 (EDM) 应用程序的数据访问。使用 System.Data.EntityClient 命名空间。

2. .NET数据提供程序的核心对象

在上一篇文章中,我们知道Connection对象、Command对象、DataReader对象以及DataAdapter对象构成了.NET数据提供程序的骨架。这四个对象非常重要,在后续的文章中,我将详细的讲解。如果需要了解这些对象的作用,可以参考上一篇文章《你必须知道的ADO.NET(一)
初识ADO.NET》

3. 其他重要的对象

如果说上述四大对象构成了.NET数据提供程序的骨架,那么下面我要说的这些对象可以说是.NET数据提供程序的血肉了。这些对象虽然没有四大核心对象那么的光鲜耀眼,但却也是“八仙过海,各显神通”。

3.1 Parameter对象

说对Parameter对象,也许大部分人会说:“哦,原来是它啊”。尽管大部分人已经很熟悉了,我还是要在这里唠叨几句。我需要强调是,这一系列的文章主要写给对ADO.NET还不熟悉,或者刚入门的读者,旨在讲解ADO.NET最最基础却又非常重要的内容。

简单的讲,Parameter对象定义了命令和存储过程的输入、输出和返回值参数。哦!看起来,好像并不是那么强大,那么Parameter对象到底有什么本领呢?

先看这样一段代码,也许很多人曾经都写过,包括我自己:

strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

只要懂一点SQL语法的童鞋都知道,这不就是一个简单的登陆查询验证代码吗?好,先别急,你知道的,说不定别人还不知道。

试想一下,如果用户(一般是那些技术高超,自称为“黑客”的高级用户)填入

userName = "' OR '1'='1";

passWord = "' OR '1'='1";

接下来,将见证奇迹的时刻:该用户竟然成功登陆网站了。哇!看起来这一切似乎多么的魔幻和神奇,其实我们稍作分析发现这也不过是一些雕虫小计。

我们将userName和passWord变量带入strSQL变量后,将得到这样的一条SQL语句:

strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"

也就是实际上运行的SQL命令会变成下面这样的

strSQL = "SELECT * FROM users;"

到这一步,我想也不需要我多说了吧,你懂的!上面的情况,用专业术语来说就是一个简单的SQL注入(SQL injection)。记得上政治课的时候,我印象最深的一句话是,“万物都是矛盾统一的”。这句话经典而又真实,以至于时刻在我的脑海里浮现。有SQL注入的出现,因此就有参数化查询(Parameterized Query )的出现。

参数化查询是指在设计与数据库连结并存取资料时,在需要填入数值或资料的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入(SQL Injection) 的攻击手法的防御方式。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数执行,因此就算参数中含有具破坏性的指令,也不会被数据库所执行。说了这么多,无非是想说明Parameter对象的重要性。黄婆卖瓜,也得自卖自夸一下吧!Parameter对象有两个非常重要的属性:DBType和Value。DBType用来设置或获取参数的类型,Value则用来设置或获取参数的值。

好了,现在我们用Parameter对象来改写简单的登陆验证代码:

1 strSQL = "SELECT * FROM users WHERE Name = @Name and Password = @Password";
2 SqlParamter[] paras = new SqlParamter[]{//参数数组
3 new SqlParamter("@Name",SqlDBType.Varchar,50)
4 new SqlParamter("@Password",SqlDBType.Varchar,50)};
5 paras[0].value = userName;//绑定用户名
6 paras[1].value = password;//绑定用户密码

3.2 两大得力助手:ConnectionStringBuilder和CommandBuilder

  • ConnectionStringBuilder:它提供一种用于创建和管理由 Connection 对象使用的连接字符串的内容的简单方法。 所有 ConnectionStringBuilder 对象的基类均为 DbConnectionStringBuilder 类。
  • CommandBuilder :它自动生成 DataAdapter 的命令属性或从存储过程中派生参数信息,并填充 Command 对象的 Parameters 集合。 所有 CommandBuilder 对象的基类均为 DbCommandBuilder 类。

4. 理解.NET数据提供程序

4.1 用于 SQL Server 的 .NET Framework 数据提供程序 (SqlClient)

用于 SQL Server 的 .NET Framework 数据提供程序 (SqlClient) 使用自己的协议与 SQL Server 进行通信。 它是轻量的且性能良好,因为它进行了优化,可直接访问 SQL Server,而无需添加 OLE DB 或开放式数据库连接 (ODBC) 层。 下图4.1.1将用于 SQL Server 的 .NET Framework 数据提供程序与用于 OLE DB 的 .NET Framework 数据提供程序进行对比。 用于 OLE DB 的 .NET Framework 数据提供程序通过 OLE DB 服务组件(它提供连接池和事务服务)和用于数据源的 OLE DB 访问接口与 OLE DB 数据源进行通信。

图4.1.1  SQL Server 与 OLE DB .NET Framework 数据提供程序进行对比

若要使用用于 SQL Server 的 .NET Framework 数据提供程序,您必须具有对 SQL Server 7.0 或更高版本的访问权限。 用于 SQL Server 类的 .NET Framework 数据提供程序位于 System.Data.SqlClient 命名空间中。 对于早期版本的 SQL Server,请将用于 OLE DB 的 .NET Framework 数据提供程序与 SQL Server OLE DB 访问接口 System.Data.OleDb 一起使用。

用于 SQL Server 的 .NET Framework 数据提供程序支持本地事务和分布式事务。 对于分布式事务,默认情况下,用于 SQL Server 的 .NET Framework 数据提供程序会自动登记在事务中,并自动从 Windows 组件服务或 System.Transactions 获取事务详细信息。

如果你使用SQL Server数据提供程序需要引入:

using System.Data.SqlClient;

4.2 用于 OLE DB 的 .NET Framework 数据提供程序

      用于 OLE DB 的 .NET Framework 数据提供程序 (OleDb) 通过 COM 互操作使用本机 OLE DB 来启用数据访问。 用于 OLE DB 的 .NET Framework 数据提供程序支持本地事务和分布式事务。 对于分布式事务,默认情况下,用于 OLE DB 的 .NET Framework 数据提供程序会自动登记在事务中,并自动从 Windows 2000 组件服务获取事务详细信息。用于 OLE DB 类的 .NET Framework 数据提供程序位于 System.Data.OleDb 命名空间中。

如果你使用OLE DB数据提供程序需要引入:

using System.Data.OleDb;

4.3 用于 ODBC 的 .NET Framework 数据提供程序

用于 ODBC 的 .NET Framework 数据提供程序 (Odbc) 使用本机 ODBC 驱动程序管理器 (DM) 来启用数据访问。 ODBC 数据提供程序支持本地事务和分布式事务两者。 对于分布式事务,默认情况下,ODBC 数据提供程序会自动登记在事务中,并自动从 Windows 2000 组件服务获取事务详细信息。用于 ODBC 类的 .NET Framework 数据提供程序位于 System.Data.Odbc 命名空间中。

如果你使用ODBC数据提供程序需要引入:

using System.Data.Odbc;

4.4 用于 Oracle 的 .NET Framework 数据提供程序

用于 Oracle 的 .NET Framework 数据提供程序 (OracleClient) 通过 Oracle 客户端连接软件启用对 Oracle 数据源的数据访问。 该数据提供程序支持 Oracle 客户端软件 8.1.7 版或更高版本。 该数据提供程序支持本地事务和分布式事务两者。

用于 Oracle 的 .NET Framework 数据提供程序要求系统上安装有 Oracle 客户端软件(8.1.7 版或更高版本),才能连接到 Oracle 数据源。

用于 Oracle 类的 .NET Framework 数据提供程序位于 System.Data.OracleClient 命名空间中,并包含在 System.Data.OracleClient.dll 程序集中。 当编译使用该数据提供程序的应用程序时,必须同时引用 System.Data.dll 和 System.Data.OracleClient.dll。

如果你使用Oracle数据提供程序需要引入:

1 using System.Data;
2 using System.Data.OracleClient;

5. 选择合适的 .NET 数据提供程序

应用程序或者数据源不同,我们就需要选择不同的.NET数据提供程序。在此,微软官方已经给了我们很好的建议,如下表:

提供程序

说明

用于 SQL Server 的数据提供程序

建议用于使用 Microsoft SQL Server 7.0 或更高版本的中间层应用程序。

建议用于使用 Microsoft 数据库引擎 (MSDE) 或 SQL Server 7.0 或更高版本的单层应用程序。

建议将用于 SQL Server 的 OLE DB 访问接口 (SQLOLEDB) 与用于 OLE DB 的 .NET Framework 数据提供程序一起使用。

对于 SQL Server 6.5 和更新版本,您必须将用于 SQL Server 的 OLE DB 访问接口与用于 OLE DB 的 .NET Framework 数据提供程序一起使用。

用于 OLE DB 的数据提供程序

建议用于使用 SQL Server 6.5 或早期版本的中间层应用程序。

对于 SQL Server 7.0 或更高版本,建议使用用于 SQL Server 的 .NET Framework 数据提供程序。

还建议用于使用 Microsoft Access 数据库的单层应用程序。 不建议将 Access 数据库用于中间层应用程序。

用于 ODBC 的数据提供程序

建议用于使用 ODBC 数据源的中间层应用程序和单层应用程序。

用于 Oracle 的数据提供程序

建议用于使用 Oracle 数据源的中间层应用程序和单层应用程序。

ADO.NET入门教程(二)了解.NET数据提供程序的更多相关文章

  1. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  2. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  3. Elasticsearch入门教程(二):Elasticsearch核心概念

    原文:Elasticsearch入门教程(二):Elasticsearch核心概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...

  4. JasperReports入门教程(二):中文打印

    JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...

  5. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  6. 无废话ExtJs 入门教程二[Hello World]

    无废话ExtJs 入门教程二[Hello World] extjs技术交流,欢迎加群(201926085) 我们在学校里学习任何一门语言都是从"Hello World"开始,这里我 ...

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

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/12/2347914.html 摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问 ...

  8. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  9. PySide——Python图形化界面入门教程(二)

    PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...

随机推荐

  1. TDirectory.CreateDirectory 完整、严谨的创建一个目录

    描述:创建一个目录,不包含多级目录(多级目录使用System.SysUtils.ForceDirectories,Vcl.FileCtrl.ForceDirectories已过时) procedure ...

  2. 交换a和b

    有点儿类似脑筋急转弯.做个标记先. 网上还看到比较奇特的,一句代码就OK的: 注:要都是int类型才行. 还有比较奇特的: 还有一个:

  3. WPF之UseLayoutRounding和SnapsToDevicePixels

    最近在工作中看别的朋友XML代码时,发现SnapsToDevicePixels 属性然后通过查询资料了解其作用 1)UserLayoutRounding为False,导致控件布局相对屏幕若不是整数则不 ...

  4. 终于成为博客员的一员了,这是我的第一篇博文,写一个关于ul li内容宽度的问题和解决方案

    第一次写博文,写一个刚才遇到的问题吧. 关于ul li文字长度不固定,一行显示多列.当指定宽度时,文字长度超过指定的li宽度时解决方案: 如下代码 <h4>发送对象(共10个会员)< ...

  5. Swift学习:闭包(Closures)

    /* 闭包(Closures)* 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值.* 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas类 ...

  6. Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player

    安装方法Ubuntu 14.04及衍生版本用户命令: 因为默认库里面有Chromium和Pepper Flash Player,安装非常容易,打开终端,输入以下命令: sudo apt-get upd ...

  7. jQuery将字符串转换成json

    _menus = eval('(' + json.data + ')'); _menus = parseJSON('(' + json.data + ')');

  8. git@oschina.net源代码管理使用日记

    git的优势: 1 可以创建分支: 2 版本控制是基于每一次提交的,而不需要考虑每次提交了多少个文件. 下载: 下载网址为:http://git-scm.com/download,根据您的操作系统选择 ...

  9. 移植linux4.7.2与ubifs到jz2440

    前言 整个暑假跟着韦东山的视频和书籍移植了linux2.3.6到jz2440,现在自己尝试移植linux4.7.2到板子上,并使用ubifs文件系统代替旧的jffs2文件系统. 下载交叉编译工具链 工 ...

  10. Codeforces Round #227 (Div. 2) E. George and Cards 线段树+set

    题目链接: 题目 E. George and Cards time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 ...