ADO.NET入门教程(二)了解.NET数据提供程序
摘要
在上一篇文章《你必须知道的ADO.NET(一) 初识ADO.NET》中,我们知道ADO.NET的两大核心组件分别是Data Provider和DataSet。如果说DataSet是ADO.NET的心脏,那么Data Provider绝对是ADO.NET的左臂右膀。Data Provider提供了访问外部数据数据源的可能性,而且外部的数据源是多样的。本文将详细说明.NET数据提供程序的作用以及如何访问不同的数据源。
目录
- 什么是.NET数据提供程序?
- .NET数据提供程序的核心对象
- 其他重要的对象
- 理解.NET数据提供程序
- 选择合适的.NET数据提供程序
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 数据源的中间层应用程序和单层应用程序。 |
- .NET Core的日志[5]:利用TraceSource写日志
- 物联网芯片正在积极开发 明年将得到爆发
- 韩国全球首测5G网络下自动驾驶 为汽车安全保驾护航的竟是路灯
- 通过与Quickbuild和Mist.io的持续集成实现云管理和使用监控
- .NET Core的文件系统[1]:读取并监控文件的变化
- ASP.NET MVC以ValueProvider为核心的值提供系统: ValueProviderFactory
- 云本机应用程序成熟度的模型
- 如何利用ETW(Event Tracing for Windows)记录日志
- 如何利用ETW(Event Tracing for Windows)记录日志
- 如何利用ETW(Event Tracing for Windows)记录日志
- ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
- .NET Core的文件系统[2]:FileProvider是个什么东西?
- Python多线程怎样优雅的响应中断异常
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入理解Bash中的尖括号(适合初学者)
- linux安装php7的方法详解
- centos7.2搭建nginx的web服务器部署uniapp项目
- 通过 SSH 在远程 Linux 系统上运行命令的方法
- 详解Linux Namespace之User
- Centos7.0安装ceph(JEWEL)及以上版本的实例解析
- 详解Linux内核进程调度函数schedule()的触发和执行时机
- Linux下使用SSH远程执行命令方法收集
- 详解Centos7.2编译安装zabbix3.2(详细步骤)
- Linux下误删messages文件的找回方法
- 自制YUM仓库的步骤讲解
- 解决centos7中tomcat启动与本机访问问题
- centos6.5配置ssh免秘钥登陆执行pssh命令的讲解
- 使用PXE自动安装CentOS7.6的教程详解
- Ubuntu环境下SSH的安装及使用详解