什么是OLEDB?

OLEDB? 这是什么什么玩艺儿? 也许你们中的许多人以前没有听说过. 要回答这个问题,我们先得回顾一下数据库连接的历史.

早期的数据库连接是非常困难的. 每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的底层API有深刻的了解. 因此,能处理各种各样数据库的通用的API就应运而生了. 也就是现在的ODBC(Open Database Connectivity), ODBC是人们在创建通用API的早期产物. 有许多种数据库遵从了这种标准,被称为ODBC兼容的数据库.
ODBC兼容的数据库包括Access, MS-SQL Server, Oracle, Informix等.

但ODBC并不是完美无缺的,它仍然含有大量的低级的调用,开发ODBC应用程序仍较困难. 开发者不得不将大量的精力花在底层的数据库通信中,而不能专注于他们所要处理的数据. 后来微软提出了一个解决方案: DAO(Data Access Objects). DAO的代码看起来象这样:

objItem.AddNew
objItem.Name = Chair
objItem.Price = 10
objItem.Update

你也许看过DAO的代码. 后来DAO演变为RDO(Remote Data Objects, 为分布式数据库体系设计), 再后来是ADO. 尽管它们都有各自的不足之处. 根据微软的说法,ODBC提供了本地SQL数据的存取,DAO提供了高级的数据对象. DAO和RDO都需要数据以SQL(Structured Query Language)的格式存储. 针对这些缺陷,微软提出了OLEDB,一个基于COM的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像).

OLEDB位于ODBC层与应用程序之间. 在你的ASP页面里,ADO是位于OLEDB之上的应用程序. 你的ADO调用先被送到OLEDB,然后再交由ODBC处理. 你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升. 那我们该如何直接连接到OLEDB呢?

要想直接连到OLEDB层,你必须改变你的connection对象连接字符串. 先用老办法创建一个connectiong对象:

Dim objConn
Set objConn = Server.CreateObject(ADODB.Connection)

接下去,我们不用常规的类似DSN=pubs or DRIVER={MS SQL-
Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine的连接字符串,而采用下面的连接字符串:

objConn.ConnectionString = Provider=ProviderName; Data
Source=DatabaseSource; Initial Catalog=DatabaseName; User ID=UserID;
Password=Password

对于SQL:
ProviderName = SQLOLEDB
Data Source = Server Name
Initial Catalog = Database Name

对于Access:
ProviderName = Microsoft.Jet.OLEDB.3.51
Data Source = Full path to .MDB file

下面让我们来看两个例子,一个是针对Access的,还有一个是针对SQL的. 如果你的连接SQL的DSN-less连接串是这样的:

DRIVER={MS SQL-Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine

那么直接连接到OLEDB的连接字符串应该是这样的:

Provider=SQLOLEDB; Data Source=myMachine; Initial Catalog=pubs; User
ID=sa; Password=

让我们来看看Access,如果你的Access的连接字符串是:

DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=c:/inetpub/wwwroot/users.mdb

那么直接连接到OLEDB的连接字符串应该是这样的:

Provider=Microsoft.Jet.OLEDB.3.51; Data
Source=c:/inetpub/wwwroot/users.mdb

就是这么简单,挺棒的吧?

这很重要吗?
现在你也许对为什么要学习这种新的数据库连接方法感到有些儿迷惑,为什么不走标准的DSN-less/System DSN路子呢? 让我来告诉你为什么. 据Wrox出的ADO 2.0
Programmer's Reference一书中的测试,用OLEDB连接而不是DSN或DSN-less的连接会得到的性能提升如下:

性能比较
SQL Access
 OLEDB DSN OLEDB DSN
Connection Times: 18 82 Connection Times: 62 99
Iterating through 1,000 Records Times: 2900 5400 Iterating through
1,000 Records Times: 100 950 
 

### OLEDB 在 C# 中的概念 OLEDB(Object Linking and Embedding, Database)是一种基于 COM 的数据库访问接口,提供了一种统一的数据访问方式,允许应用程序通过标准接口访问不同种类的数据源,包括 Excel、Access、SQL Server 等[^1]。在 C# 中,可以通过 ADO.NET 的 `System.Data.OleDb` 命名空间提供的类(如 `OleDbConnection`、`OleDbCommand`、`OleDbDataAdapter`)来操作 Excel 文件,将 Excel 视作数据库表进行读写操作。 --- ### 使用 OLEDB 连接 Excel 文件 要连接 Excel 文件,首先需要构造一个符合格式的连接字符串。对于 `.xlsx` 格式的 Excel 文件,通常使用以下格式的连接字符串: ```csharp string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\""; ``` 其中: - `Provider=Microsoft.ACE.OLEDB.12.0` 表示使用 Microsoft Access Database Engine 的 OLEDB 提供程序。 - `Data Source` 指定 Excel 文件的路径。 - `Extended Properties` 中的 `Excel 12.0` 表示文件格式为 Excel 2007 及以上版本;`HDR=YES` 表示第一行是列名;`IMEX=1` 表示将所有列视为文本输入,避免类型转换错误[^1]。 --- ### 使用 OleDbDataAdapter 读取 Excel 数据 通过 `OleDbDataAdapter` 可以执行 SQL 查询,将 Excel 中的数据读取到 `DataTable` 中,便于进一步处理。例如: ```csharp using System.Data; using System.Data.OleDb; public DataTable ReadExcelToDataTable(string filePath) { string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\""; using (OleDbConnection conn = new OleDbConnection(connString)) { conn.Open(); OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn); OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } ``` 该方法打开指定的 Excel 文件,并从第一个工作表中读取所有数据填充至 `DataTable` 中。 --- ### 使用 OleDbCommand 写入 Excel 数据 除了读取,还可以通过 SQL 命令向 Excel 文件中插入数据。例如,创建一个新的工作表并向其中插入数据: ```csharp using System.Data.OleDb; public void WriteDataToExcel(string filePath) { string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\""; using (OleDbConnection conn = new OleDbConnection(connString)) { conn.Open(); // 创建新的工作表 OleDbCommand createCmd = new OleDbCommand("CREATE TABLE [NewSheet] ([ID] INTEGER, [姓名] VARCHAR, [年龄] INTEGER)", conn); createCmd.ExecuteNonQuery(); // 插入数据 OleDbCommand insertCmd = new OleDbCommand("INSERT INTO [NewSheet] ([ID], [姓名], [年龄]) VALUES (1, '张三', 25)", conn); insertCmd.ExecuteNonQuery(); } } ``` 此代码首先创建了一个名为 `NewSheet` 的新工作表,并定义了三个字段:`ID`、`姓名` 和 `年龄`,然后插入了一条记录[^2]。 --- ### 注意事项 - **驱动依赖**:使用 ACE OLEDB 驱动程序时,必须确保目标系统上安装了 Microsoft Access Database Engine(x86 或 x64 版本)。 - **文件格式兼容性**:如果操作的是 `.xls` 格式文件(Excel 2003),应使用 `Microsoft.Jet.OLEDB.4.0` 提供程序。 - **并发访问限制**:OLEDB 不支持多个用户同时写入同一个 Excel 文件,因此在多线程或服务器环境中需谨慎使用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值