首页 > 解决方案 > Excel to DataSet 使用 OLEDB 在 .NET Core 和 .NET Framework 之间工作方式不同

问题描述

我有一个引用 .NET Framework 类库的辅助服务。类库包含将 Excel 转换为数据集的方法。在 Visual Studio 上调试时,一切都按预期工作,但发布后我收到错误消息:

'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。

为了调试,我使用完全相同的代码构建了以下两个控制台应用程序——一个在 .NET Core 中,另一个在 .NET Framework 中。然后我在两台计算机上运行这些项目。

using System;
using System.Data;
using System.Data.OleDb;
using System.Text;
    
namespace ToDataSheetCore
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet dt2 = ExcelToDataSetCommon("C:\\pathToExcel\\excelFile - AUGUST 04 2021.xlsx");
            StringBuilder sb2 = new StringBuilder();
            foreach (DataTable table in dt2.Tables)
            {
                foreach (DataRow row in table.Rows)
                {
                    sb2.Append(string.Join(" ", row.ItemArray));
                    sb2.AppendLine();
                }
            }
            Console.WriteLine(sb2);
            Console.ReadLine();
        }

        public static DataSet ExcelToDataSetCommon(string SourceFilename)
        {
            DataSet ds = new DataSet();
            try
            {
                string connStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES;\"", SourceFilename);

                OleDbConnection conn = new OleDbConnection(connStr);
                conn.Open();
                DataTable schemaDT = conn.GetSchema("Tables", new string[] { null, null, null, "TABLE" });
                conn.Close();

                string tableName = schemaDT.Rows[0]["TABLE_NAME"].ToString();

                OleDbCommand cmd = new OleDbCommand(string.Format("SELECT * FROM [{0}]", tableName), conn);

                OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
                adapter.Fill(ds);

            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.Message);
            }
            return ds;
        }
    }
}

结果

  1. 电脑A

    • .NET 核心

      1. 调试模式
        将excel内容打印到控制台
      2. 发布模式-自包含(win64, anypc)

        'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。

    • .NET 框架

      1. 调试模式

        'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。

      2. 发布模式——自包含

        'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。

  2. 电脑B

    • .NET 核心

      1. 调试模式

        'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。

      2. 发布模式-自包含(win64, anypc)

        'Microsoft.ACE.OLEDB.12.0' 提供程序未在本地计算机上注册。

    • .NET 框架

      1. 调试模式
        将excel内容打印到控制台(卸载AccessDatabaseEngine失败)
      2. 发布模式 - 自包含
        将 excel 内容打印到控制台(卸载 AccessDatabaseEngine 失败)

我了解安装 AccessDatabaseEngine 提供程序会产生效果,但我不了解 .NET Framework 和 .NET Core 的不同结果。虽然我已经求助于使用ExcelDataReader,因为我想避免外部依赖。

我对 .NET Core 和 .NET Framework 之间使用 OleDB API 的结果差异感到困惑。有没有办法可以将 AccessDatabaseEngine 提供程序与 .NET 项目一起发布?

标签: excelasp.net-coredatasetoledb.net-framework-4.8

解决方案


推荐阅读