ADO.NET的数据提供程序和数据连接——ADO.NET学习&应用笔记之二

本文介绍了ADO.NET的数据提供程序,包括四种托管数据提供程序及其适用场景,指出SQL Server数据提供程序性能更优。还阐述了使用Connection对象连接数据库的方法,涵盖连接字符串差异、存储方式及连接池机制,同时给出了相关参考资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类似于ADODB连接模式的数据库操作程序的,是ADO.NET的数据提供程序。.NET Framework 1.1版的ADO.NET提供了四种托管数据提供程序。

一、ADO.NET的数据提供程序
ADO.NET配套的四种数据提供程序,分别是用于SQL Server7.0及更高版本的SqlClient数据提供程序,对应的名字空间是System.Data.SqlClient;用于OLE DB数据源的OleDb数据提供程序,对应的名字空间是System.Data.OleDb;用于ODBC数据源的Odbc数据提供程序,对应的名字空间是System.Data.Odbc;用于Oracle数据源的OracleClient数据提供程序,对应的名字空间是System.Data.OracleClient。(注意:.NET Framework1.0版本不包括Odbc和OracleClient数据提供程序,需要从微软官方站点下载安装)

ADO.NET的SQL Server数据提供程序比OLE DB数据提供程序有着更优异的性能。前者专用于SQL Server,并有针对的优化,通过TDS数据包与SQL Server直接对话,后者必须通过一个COM组件集,即数据源的OLE DB提供程序和OLE DB服务组件来与数据源进行交流。因此对于SQL Server的访问,推荐使用SQL Server数据提供程序。下图为两者的数据访问比较图:


二、使用Connection对象连接数据库
需要访问数据源的数据,首先要通过Connection对象,连接到指定的数据源,FCL数据提供程序的Connection类是一个通用接口System.Data.IDBConnection的实现。
Connection的构造函数通常都有一个连接字符串作为参数,连接字符串也可以使用Connction.ConnectionString属性设置,如果使用c#表示,它们创建连接语句形式通常如下:

IDBConnection conn = new xxxConnection("connection string");
conn.Open();

Connection的Close方法能够关闭数据连接,但是有些时候Close不能够物理性质的中断到数据库的连接。除了Close方法,还有一个Dispose方法,它会调用Close方法,此外通过设置一个Boolean参数指定非托管资源是否应该释放(包括COM接口指针、ODBC句柄等),该方法调用之后,Connection对象就完全释放而无法重用了

(一)连接字符串的差异
对于不同的数据提供程序,连接字符串存在着差异。
SqlConnection的数据库连接字符串通常如下:
"Server=mySQLServer;Database=northwind;User ID=sa;Password=mypwd;"
OleDbConnection的数据库连接字符串如下:
"Provider=SQLOLEDB;Data Source=mySqlServer;Initial Catalog=northwind;User ID=sa;Password=mypwd;"
OdbcConnection的数据库连接字符串如下:
"Driver={SQL Server};Server=localhost;Database=northwind"或者"DSN=dsnname"
OracleConnection的数据库连接字符串如下:
"Data Source=Oracle8i;User ID=sa;pwd=mypwd"
它们常用属性可以参考下表:

SqlConnectionOleDbConnectionOdbcConnectionOracleConnection说明
Data Source/ServerData SourceServerData Source/Server 数据源名称或者网络地址
Initial Catalog/DatabaseInitial CatalogDatabase数据库名
User IDUser IDUser IDUser ID服务代理用户
PasswordPasswordPasswordPassword用户密码
ProviderOLE DB数据提供程序,OleDbConnection连接字符串所必需的参数
DSNOdbcConnection专用的连接字符串参数,DSN名称

更多的连接对象的连接字符串参数可以参考FCL SDK。
SqlConnection.ConnectionString属性参考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlConnectionClassConnectionStringTopic.asp
OleDbConnection.ConnectionString属性参考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOleDbOleDbConnectionClassConnectionStringTopic.asp
OdbcConnection.ConnectionString属性参考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOdbcOdbcConnectionClassConnectionStringTopic.asp
OracleConnection.ConnectionString属性参考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOracleClientOracleConnectionClassConnectionStringTopic.asp

(二)应用程序中连接字符串的存储
为了方便管理数据连接,通常数据连接字符串不写为硬码,而存储在应用程序之外。
《.NET 数据访问架构指南》一文用一节讨论了链接字符串的存储。链接字符串的存储可以采用下面5种方式:
1、应用程序配置文件 例如用于ASP.NET Web应用程序的Web.config文件。
2、通用数据链接文件(UDL) (只被OLE DB .NET 数据供应器所支持)
3、Windows 注册表
4、定制文件
5、COM+ 目录,通过过使用构造字符串(只用于服务组件)
这些方式各有优缺点,在ASP.NET中最常见的是使用Web.config存储连接字符串,包含在元素appSettings的一个add节点当中。
 <appSettings>
  <add key="DBConnStr"
     value="server=(local);Integrated Security=SSPI;database=northwind"/>
 </appSettings>

在ASP.NET应用程序当中使用System.Configuration.ConfigurationSettings类的AppSettings静态属性,可以获取应用程序的定制设置。

(三)连接池(Connection pooling)
连接池能让数据库中使用同一个帐号的不同会话共享连接,避免频繁的打开和关闭连接,它能够显著的提高应用程序的性能。
使用SQL Server数据提供程序的连接池需要注意,每当应用打开一个连接,.NET Framework将创建池,每个连接池都和一个不同的连接字符串相关联。也就是说,如果新创建的一个连接使用的连接字符串和现有的池中连接相匹配,将创建新的池。注意:池化机制对名称-值对间的空格敏感。
下面的三个连接创建了三个不同的池:
SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Initial Catalog=pubs");
conn.Open(); //创建池A

SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind");
conn.Open(); //创建池B,和前面的连接字符串不一样

SqlConnection conn = new SqlConnection("Integrated Security=SSPI ;Initial Catalog=Northwind");
conn.Open(); //创建池C,SSPI后多了一个空格

参考资源:
1、Bob Beauchemin《Essential ADO.NET》
2、.Net Framework SDK《开发人员指南》
3、Dino Esposito《剖析 .NET 托管提供程序》
4、Alex Mackman《.NET 数据访问架构指南》

### ADO.NET 学习笔记及相关教程 #### 关于 ADO.NET 的基本概念 ADO.NET.NET Framework 中用于访问操作数据的核心技术之一。它提供了两种主要的组件来实现这一目标:.NET Framework 数据提供程序以及 DataSet[^1]。 - **.NET Framework 数据提供程序** 它是一组类,专门设计用来连接到特定的数据源(如 SQL Server、Oracle 或 Access)、执行命令并检索结果集。这些类通常包括 `Connection`、`Command` `DataAdapter` 等对象。 - **DataSet** 提供了一种断开模式的数据存储方式,允许应用程序在内存中保存来自不同数据源的数据,并支持离线编辑更新功能。 #### 数据库连接与操作基础 为了能够通过 ADO.NET数据库进行读写操作,首先需要掌握如何构建正确的连接字符串。这方面的具体指导可以在相关文章中找到,例如《ADO.NET 操作 ACCESS 数据库&mdash;&mdash;数据库连接字符串》[^2]。该文档详细介绍了针对不同的数据库环境配置合适的连接参数的方法。 #### 使用事务管理复杂业务逻辑 当涉及到多步操作时,确保数据一致性至关重要。为此,ADO.NET 支持利用事务机制完成批量处理任务。如果某个环节失败,则整个过程会被回滚至初始状态,从而保障系统的稳定性可靠性[^3]。 以下是基于上述理论的一个简单示例代码片段展示如何运用 ADO.NET 执行带事务控制的基本 CRUD 功能: ```csharp using System; using System.Data; using System.Data.SqlClient; class Program { static void Main() { string connectionString = &quot;YourConnectionStringHere&quot;; using(SqlConnection conn = new SqlConnection(connectionString)) { SqlTransaction transaction = null; try{ conn.Open(); // 开始新事物 transaction = conn.BeginTransaction(); SqlCommand command = new SqlCommand(&quot;INSERT INTO TestTable (ColumnA, ColumnB) VALUES (&#39;ValueA&#39;, &#39;ValueB&#39;)&quot;, conn); command.Transaction = transaction; int rowsAffectedInsert = command.ExecuteNonQuery(); SqlCommand updateCmd = new SqlCommand(&quot;UPDATE AnotherTable SET FieldX=&#39;NewData&#39; WHERE Condition=true&quot;, conn); updateCmd.Transaction = transaction; int rowsAffectedUpdate = updateCmd.ExecuteNonQuery(); // 如果一切正常则提交 transaction.Commit(); } catch(Exception ex){ Console.WriteLine($&quot;An error occurred: {ex.Message}&quot;); if(transaction !=null){ transaction.Rollback(); // 出现异常就回滚 } } } } } ``` 此段 C# 编写的脚本演示了怎样创建一个安全可靠的交易流程,在其中包含了插入记录与修改现有字段两项动作。只有两者都顺利完成才会真正生效;反之任何一个步骤出现问题都将触发自动撤销更改的动作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值