C#进阶-OleDb操作Excel和数据库

在C#编程中,使用OleDb可以方便地实现对Excel文件和数据库的操作。本文探讨了在C#中使用OleDb技术操作Excel和数据库的策略。文章详述了OleDb的定义、配置环境的步骤,并通过实际代码示例演示了如何高效读写Excel文件和交互数据库。文中还评估了OleDb技术的优缺点,为需要处理多种数据源的开发者提供了一种有效的数据操作方案。


一、OleDb简介

OleDb(Object Linking and Embedding, Database)是微软的一套数据库访问接口,支持对多种数据源的访问,包括SQL Server、Access以及Excel等。它提供了一种统一的方法来访问不同的数据源。在.NET环境下,OleDb可以通过System.Data.OleDb命名空间提供的类来使用。


二、OleDb安装前准备

1. 环境准备

.NET Framework: 确保您的开发环境中安装了.NET Framework,因为OleDb类库是基于.NET Framework的。

引用设置: 在Visual Studio中,需要添加对System.Data.dll的引用,以确保项目可以使用System.Data.OleDb命名空间。


2. 安装相应的驱动

使用 OLE DB 操作数据库或 Excel 时,你需要确保安装了适当的 OLE DB 驱动程序,这取决于你要连接的具体数据库系统。每种数据库系统都可能有一个或多个专用的 OLE DB 驱动,这些驱动允许应用程序通过 OLE DB 接口与数据库通信。

Excel 的 OLE DB 驱动:
对于Excel文件的数据操作,你可以使用Microsoft提供的OLE DB驱动来进行读取和写入操作。这些驱动允许通过OLE DB接口与Excel文件进行交互。具体使用的驱动取决于Excel文件的版本和你的系统类型(32位或64位)。

① 🎯Microsoft Access Database Engine OLE DB Provider

  • 适用版本:Excel 2007 及更高版本的文件(.xlsx)。
  • 驱动名称
    • 对于旧版本或需要兼容性的,可以使用 Microsoft.ACE.OLEDB.12.0
    • 对于更高版本的Office,可以使用 Microsoft.ACE.OLEDB.16.0

② 🔥Microsoft Jet OLE DB Provider

  • 适用版本:Excel 2003 及更早版本的文件(.xls)。
  • 驱动名称Microsoft.Jet.OLEDB.4.0
  • 注意:这个驱动仅支持32位系统。

驱动下载地址

Access Database Engine最新版本下载地址:(https://learn.microsoft.com/zh-cn/sql/connect/oledb/download-oledb-driver-for-sql-server?view=sql-server-ver16);
Access Database Engine历史版本(16及之后)下载地址:(https://learn.microsoft.com/zh-cn/sql/connect/oledb/release-notes-for-oledb-driver-for-sql-server?view=sql-server-ver16#previous-releases);
已经绝版的Microsoft.ACE.OLEDB.12.0(Microsoft Access 2010 数据库引擎)下载地址:(https://download.csdn.net/download/weixin_41793160/89286174) (注意只支持32位,.NET程序目标生成不能位X64);
已经绝版的Microsoft.Jet.OLEDB.4.0(2007 Office system 驱动程序)下载地址:
同Microsoft.ACE.OLEDB.12.0。

安装流程
未安装Microsoft.ACE.OLEDB.12.0驱动报错的截图。
在这里插入图片描述
下载Microsoft.ACE.OLEDB.12.0驱动安装程序。
在这里插入图片描述
点击安装。
在这里插入图片描述
选择安装路径。
在这里插入图片描述
安装完成。
在这里插入图片描述


常见数据库的 OLE DB 驱动:

① 🌈Microsoft SQL Server

  • Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL):是当前推荐的驱动,支持最新的SQL Server功能。
  • SQL Server Native Client (SQLNCLI):旧版本的驱动,依然广泛使用,但可能不支持最新的数据库功能。

② ✨Microsoft Access

  • Microsoft Access Database Engine OLE DB Provider (ACEOLEDB):适用于 Access 2007 及以上版本。
  • Microsoft Jet OLE DB Provider (Jet.OLEDB):用于 Access 2003 及更早版本。

③ 🚀Oracle

  • Oracle Provider for OLE DB:Oracle 官方提供的 OLE DB 驱动。

④ 🍀MySQL

  • MySQL 官方没有直接提供专用的 OLE DB 驱动,通常推荐使用 ODBC 驱动或第三方提供的 OLE DB 驱动。

⑤ 🧩PostgreSQL

  • 类似于 MySQL,PostgreSQL 官方也没有提供 OLE DB 驱动。推荐使用 ODBC 驱动或第三方提供的 OLE DB 驱动。

确保驱动安装正确并且连接字符串配置适当是成功使用 OLE DB 的关键。不正确的驱动安装或配置可能导致连接失败或数据访问错误。


三、OleDb操作EXCEL

1. 连接字符串

连接Excel文件时,您的连接字符串会略有不同,这取决于Excel文件的版本(例如Excel 97-2003工作簿.xls与Excel 工作簿.xlsx):

  • 对于.xls文件:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=路径;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
  • 对于.xlsx文件:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=路径;Extended Properties="Excel 12.0 Xml;HDR=Yes;IMEX=1";

2. 读取数据

使用OleDb读取Excel文件通常涉及以下步骤:

  1. 创建OleDbConnection对象来建立到Excel文件的连接。
  2. 创建OleDbCommand对象来定义要执行的SQL查询。
  3. 创建OleDbDataAdapter和DataSet,用于接收查询结果。
  4. 执行查询并填充DataSet,之后可以通过DataTable对象来操作数据。
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\path\\to\\file.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'";
using(OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    DataTable data = ds.Tables[0];
    // 数据现在存储在data中,可以进行进一步处理
}

3. 写入数据

要向Excel文件写入数据,可以使用OleDbConnectionOleDbCommand对象。

下面示例展示了如何打开一个连接,单条写入数据到Excel表格中。

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();  // 打开连接

    // 构建插入命令
    OleDbCommand cmd = new OleDbCommand("INSERT INTO [Sheet1$] (Column1, Column2) VALUES ('Value1', 'Value2')", conn);

    // 执行插入命令
    cmd.ExecuteNonQuery();

    // 关闭连接
    conn.Close();
}

如果需要向Excel文件批量写入数据,可以构建多个INSERT语句,或使用OleDbDataAdapterDataTable,通过调整DataTable中的数据然后调用Update()方法来实现。

DataTable dt = new DataTable();
// 假设dt已经被填充了数据
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.InsertCommand = new OleDbCommand("INSERT INTO [Sheet1$] (Column1, Column2) VALUES (?, ?)", conn);
    adapter.InsertCommand.Parameters.Add("@Column1", OleDbType.VarChar, 255, "Column1");
    adapter.InsertCommand.Parameters.Add("@Column2", OleDbType.VarChar, 255, "Column2");

    conn.Open();
    adapter.Update(dt);  // 更新Excel文件
    conn.Close();
}

这种方法特别适合处理大量数据,可以显著提高数据插入的效率。


四、OleDb操作数据库

使用OLE DB进行数据库访问(包括增加、删除、修改和查询操作)涉及到几个关键的.NET类,主要是OleDbConnectionOleDbCommandOleDbDataAdapterOleDbDataReader。下面是一个使用OLE DB来执行增删改查(CRUD:Create, Read, Update, Delete)操作的基本示例,这里假设数据库是一个简单的Microsoft Access数据库或其他支持OLE DB的数据库。

1. OleDb实现数据增删改查

代码示例

using System;
using System.Data;
using System.Data.OleDb;

class Program
{
    static void Main()
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\yourdatabase.mdb;";

        // 创建一个新的OleDbConnection,并将其封装在using语句中以确保资源的释放
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            connection.Open();

            // 创建(Create)
            using (OleDbCommand command = new OleDbCommand("INSERT INTO Employees (FirstName, LastName) VALUES ('John', 'Doe')", connection))
            {
                command.ExecuteNonQuery();
            }

            // 读取(Read)
            using (OleDbCommand command = new OleDbCommand("SELECT FirstName, LastName FROM Employees", connection))
            using (OleDbDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    Console.WriteLine($"{reader["FirstName"]} {reader["LastName"]}");
                }
            }

            // 更新(Update)
            using (OleDbCommand command = new OleDbCommand("UPDATE Employees SET LastName = 'Smith' WHERE FirstName = 'John'", connection))
            {
                command.ExecuteNonQuery();
            }

            // 删除(Delete)
            using (OleDbCommand command = new OleDbCommand("DELETE FROM Employees WHERE FirstName = 'John'", connection))
            {
                command.ExecuteNonQuery();
            }
        }
    }
}

解释

  1. 连接字符串 (connectionString): 指定了OLE DB提供者、数据库文件路径等信息。
  2. OleDbConnection: 用于建立与数据库的连接。
  3. OleDbCommand: 用于执行SQL命令。
  4. OleDbDataReader: 用于读取从数据库返回的结果。

注意事项

  • 确保修改连接字符串以匹配你的数据库设置。
  • 这个例子中使用的是Microsoft Access的OLE DB提供者 (Microsoft.Jet.OLEDB.4.0),你可能需要根据你的数据库类型调整提供者。
  • 确保数据库路径、SQL语句和数据库表结构与示例代码中的相符。

2. OleDb实现事务管理

OLE DB 允许你通过OleDbTransaction来控制事务,这样可以确保数据的完整性和一致性。在一个事务中,你可以执行多个操作,要么全部成功,要么全部失败,从而避免数据不一致的情况出现。

代码示例

using System;
using System.Data;
using System.Data.OleDb;

class Program
{
    static void Main()
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\yourdatabase.mdb;";
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            connection.Open();
            OleDbTransaction transaction = connection.BeginTransaction();

            try
            {
                OleDbCommand command = connection.CreateCommand();
                command.Transaction = transaction;

                command.CommandText = "INSERT INTO Table1 (Column1) VALUES ('Value1')";
                command.ExecuteNonQuery();

                command.CommandText = "INSERT INTO Table2 (Column2) VALUES ('Value2')";
                command.ExecuteNonQuery();

                // 提交事务
                transaction.Commit();
                Console.WriteLine("Both records are written to database.");
            }
            catch (Exception ex)
            {
                // 回滚事务
                transaction.Rollback();
                Console.WriteLine("There was an error, transaction was rolled back.");
                Console.WriteLine(ex.Message);
            }
        }
    }
}

这个示例展示了如何使用事务来确保数据的一致性,只有当所有操作都成功时才提交事务,否则回滚所有操作。这是数据库操作中一个非常重要的高级功能。


3. OleDb实现异步操作

在.NET中,使用OLE DB进行异步数据库操作可以通过多种方式实现,比如使用Taskasync/await模式。

代码示例

using System;
using System.Data;
using System.Data.OleDb;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\yourdatabase.mdb;";
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            await connection.OpenAsync();

            using (OleDbCommand command = new OleDbCommand("SELECT * FROM Employees", connection))
            {
                using (OleDbDataReader reader = (OleDbDataReader)await command.ExecuteReaderAsync())
                {
                    while (await reader.ReadAsync())
                    {
                        Console.WriteLine($"{reader["FirstName"]} {reader["LastName"]}");
                    }
                }
            }
        }
    }
}

在这个例子中,OpenAsync, ExecuteReaderAsync, 和 ReadAsync 方法被用来异步打开连接、执行查询和读取结果。这种方法非常适合用在需要维护应用程序响应性的场景中,比如GUI应用程序或者高负载Web应用程序。


4. OleDb调用存储过程

代码示例

using System;
using System.Data;
using System.Data.OleDb;

class Program
{
    static void Main()
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\yourdatabase.mdb;";
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            connection.Open();

            using (OleDbCommand command = new OleDbCommand("GetEmployeeDetails", connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                // 添加输入参数
                command.Parameters.AddWithValue("@EmployeeId", 1);

                // 如果存储过程有返回值
                command.Parameters.Add(new OleDbParameter("@ReturnValue", OleDbType.VarChar, 100));
                command.Parameters["@ReturnValue"].Direction = ParameterDirection.Output;

                command.ExecuteNonQuery();

                // 读取输出参数的值
                string result = command.Parameters["@ReturnValue"].Value.ToString();
                Console.WriteLine("Result: " + result);
            }
        }
    }
}

这个示例展示了如何调用名为"GetEmployeeDetails"的存储过程,它假定此存储过程接收一个名为@EmployeeId的输入参数,并返回一些数据。在实际应用中,你需要根据实际存储过程的定义来调整参数的名称和类型。


五、OleDb操作总结

1. OleDb和其他数据库操作方式的对比

特性OleDbADO.NET(SqlClient等)Entity Framework
数据库支持支持多种数据库,包括SQL Server、Oracle等特定于数据库(如SqlClient针对SQL Server)支持多种数据库
性能通常较慢,因为它提供了一层抽象直接与数据库通信,性能较高高级抽象,性能优化可变
操作方式低级,需要手动编写SQL语句和管理连接低级,同样需要手动处理SQL和连接高级抽象,自动处理SQL
代码复杂性较高,需要处理更多的细节较高,类似OleDb较低,简化数据操作
平台依赖性较高,依赖于安装的OLE DB提供程序较低,通常内置支持较低,内置支持
设计目的数据访问的通用解决方案,兼容性好针对特定数据库的优化访问全面的ORM解决方案

2. OleDb和其他Excel操作方式的对比

特性OleDbExcel InteropEPPlus等第三方库
系统要求需要安装OLE DB驱动需要安装Microsoft Office无额外安装要求
性能中等,适合中小规模数据处理较慢,尤其是大量数据时较快,针对大数据进行了优化
操作复杂性高,需要编写SQL语句高,需要使用Office COM API低,简洁的API
功能丰富性适合简单的数据读写功能丰富,可以操作Excel的几乎所有特性功能丰富,专注于数据处理
编程模型通过SQL语句访问数据直接操作Excel对象模型使用类似Excel的对象模型
处理复杂文档能力限制较多,不适合处理复杂的Excel文件格式非常适合处理复杂文档较适合处理数据密集型文档

3. OleDb操作总结

  • 通用性:OleDb提供了一个广泛的数据库访问解决方案,支持多种数据库系统。这使得它非常适合需要与多种数据源交互的应用程序。
  • 性能考虑:由于OleDb提供了一个通用的接口,可能在性能上不如专用的数据库访问技术,如直接使用SqlClient等。
  • 适用场景:OleDb非常适合那些不需要高性能数据库交互,但需要与多种数据库兼容的应用程序。对于简单的Excel数据操作也很有用,尤其是在没有安装Excel的服务器环境中。
  • 编程复杂性:使用OleDb进行数据库操作通常需要较为复杂的代码来管理连接、执行SQL命令等,不如某些现代ORM框架(如Entity Framework)提供的抽象级别高。

总的来说,OleDb是一个非常强大的工具,特别是在需要操作多种数据源的情况下。然而,对于特定的应用需求,使用更现代和专用的库可能会更加高效和简洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】第十站:vector 中通用函数的模拟实现

目录 vector中的三个重要迭代器 默认成员函数 构造函数(无参构造) 构造函数(函数模板) 构造函数(带有默认参数) size_t int 拷贝构造函数 赋值重载 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size capacity resize 修改容器内容相关函数 reser…

Django项目之电商购物商城 -- 创建收货地址

Django项目之电商购物商城 – 创建收货地址 一. 在users中创建新的视图与路由用于创建收货地址 # 设置收货地址 class AddressView(View):def get(self , request):return render(request , "user_center_site.html")# 设置收货地址path(user_center_site/, views.…

web前端学习笔记9

9. HTML5新增元素及属性 9.1 HTML5新增结构元素 HTML5引入了几个新的结构元素,极大地改善了网页的组织和结构方式。以下是HTML5中的一些关键新结构元素: 标签说明<header>页面或页面中某一个区块的页眉,通常是一些引导和导航信息<nav>可以作为页面导航的链接组&…

【c++】线程池的原理及实现

&#x1f4bb;文章目录 &#x1f4c4;前言线程池的原理概念工作原理 线程池的实现线程池的基础结构任务队列的实现工作线程的实现 线程池的应用与拓展线程池的拓展 &#x1f4d3;总结 &#x1f4c4;前言 不知道各位是否有试过点进限时抽奖网站、抢票网站呢&#xff1f;你是否好…

第19讲:Ceph集群CrushMap规则定制与调优:从基础到高级应用

文章目录 1.CrushMap规则拓扑结构1.1.集群默认的CrushMap规则拓补图1.2.自定义的CrushMap规则拓补图 2.定制CrushMap规则的方法以及注意事项3.通过二进制文件编写一套CrushMap规则3.1.将系统默认的CrushMap规则导出3.2.根据需求编写CrushMap规则3.3.将编写好的规则导入到集群中…

Fastapi+docker+tortoise-orm+celery

因为项目是后期引入celery,所以导致构建docker的时候只有fastapi的项目&#xff0c;celery的重启比较麻烦 1.docker安装celery pip install celery安装celery的时候注意python版本与celery版本的适配&#xff0c;有些celery的版本不支持python的版本&#xff0c;具体的版本请看…

计算机毕业设计 | vue+springboot汽车销售管理系统(附源码)

1&#xff0c;项目介绍 本项目基于spring boot以及Vue开发&#xff0c;前端实现基于PanJiaChen所提供的开源后台项目vue-element-admin改造。 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理。 2&…

记录如何查询域名txt解析是否生效

要查询域名的TXT记录&#xff0c;可以使用nslookup命令。具体步骤如下&#xff1a;12 打开命令行终端。输入命令 nslookup -qttxt 域名&#xff0c;将"域名"替换为你要查询的实际域名。执行命令后&#xff0c;nslookup会返回域名的TXT记录值。 如何查询域名txt解析是…

面试题库-项目

1.项目主要实现了哪些功能&#xff1f; 本项目是专门为校园食堂窗口定制的一款软件产品&#xff0c;包括系统管理后台和客户端两部分。其中系统管理后台主要提供给食堂内部员工使用&#xff0c;可以对餐厅的菜品、套餐、订单、员工等进行管理维护。客户端主要提供给学生及校职…

什么是分库分表?代表性框架有哪些?

在互联网系统开发过程中&#xff0c;所谓的分库分表并不是一个新概念。或者说&#xff0c;对于很多开发人员而言&#xff0c;说起分库分表&#xff0c;大家都或多或少有所了解&#xff0c;也都知道数据量大了就需要进行分库分表。但是究竟如何实现分库分表呢&#xff1f; 要想…

创建Spring Boot项目及配置

目录 一、创建项目所需要的插件 1、安装插件 二、创建项目 三、创建项目所面临的常见问题。 1、IDEA不能识别 2、无效的发行版本 3、确认jar包是否下载成功 一、创建项目所需要的插件 1、安装插件 首先需要在IDEA插件里面搜索Spring&#xff0c;选择Spring Boot Helper…

什么是短信群发上行和下行

短信群发是一种广泛应用于商业和个人通信的技术&#xff0c;通过一次多条的方式&#xff0c;可以快速高效地传递信息。在实际的群发过程中&#xff0c;会涉及到上行和下行的概念。本文将详细介绍什么是短信群发上行和下行&#xff0c;并解释它们的应用。 什么是短信群发上行 群…

Dbeaver连接一段时间不操作后断开的问题

右键数据库连接点击编辑连接点击初始化将连接保持改成60s

BW4HANA混合建模 用ADSO的哪个视图?

写日志的ADSO除了1,2,3表之外。还会有6,7,8view。8view是上了BW4HANA2.0之后激活ADSO就会生成的。如果旧版本没有8&#xff0c;那就RSDG_ADSO_ACTIVATE激活一下。 如果勾了外部HANA视图&#xff0c;那就等于说还有一个HANA view。 首先咱知道ADSO是BW里面用来物理存储&#xf…

做一个属于自己的软件-pyside6快速上手教程

首先环境需要安装python3和pip&#xff0c;软件使用pycharm&#xff0c;安装也都很简单 首先需要安装pyside6,在终端执行&#xff1a; pip install pyside6 然后进入可视化编辑界面 pyside6-designer 进入后创建即可 可以从左侧点击鼠标拉组件进入到中间的工作区&#xff…

BLIP和BLIP2 论文讲解

文章目录 BLIPIntroductionMethod模型架构预训练目标字幕和过滤&#xff08;Capfilt&#xff09; BLIP2IntroductionMethod模型结构Q-Former预训练第一阶段Q-Former预训练第二阶段 BLIP 论文&#xff1a; 《BLIP: Bootstrapping Language-Image Pre-training for Unified Visio…

详解BOM编程

华子目录 BOM编程window对象常见的window对象的属性常见的window对象的方法注意 history对象history对象的属性history对象的方法 screen 对象navigator 对象属性方法 location对象属性方法示例 BOM编程 JavaScript本质是在浏览器中运行&#xff0c;所以JavaScript提供了BOM&a…

一文详解FDA邮件认证证书的重要性及其应用

随着全球化和电子商务的飞速发展&#xff0c;跨国贸易和沟通变得越来越频繁。在这个过程中&#xff0c;邮件作为重要的沟通工具&#xff0c;其安全性和可信度成为了各方关注的焦点。FDA&#xff08;美国食品药品监督管理局&#xff09;邮件认证证书就是在这一背景下应运而生的一…

1W 3KVDC 隔离 稳压单输出 DC/DC 电源模块——TPV-SAR 系列

TPV-SAR系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压…

mac电脑如何安装java

1、检查当前系统的 Java 版本 打开终端,输入以下命令查看当前 Java 版本 /usr/bin/java -version 2、前往 Java 官网下载 Java JDK 打开 Java 官网 (https://www.java.com/zh-CN/download/) 并下载最新版本的 Java JDK。 3、安装 Java JDK 双击下载的 .dmg 文件启动安装程序…