错误显示"The 'Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上

本文关键字:程序 计算机 The quot 显示 Microsoft ACE 错误 OLEDB | 更新日期: 2023-09-27 18:06:14

我正在使用Windows 7 64bit,但我得到这个错误:

"没有在本地机器上注册'Microsoft.ACE.OLEDB.12.0'提供程序。"

创建连接的代码如下:

var fileName = @"C:'ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text'"";
using (var conn = new OleDbConnection(connectionString))
{
    conn.Open();
    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";
        var adapter = new OleDbDataAdapter(cmd);
        var ds = new DataSet();
        adapter.Fill(ds);
    }
}

如何在64位应用程序中解决此问题?

在我的项目设置我使用设置Any CPU的应用程序

错误显示"The 'Microsoft.ACE.OLEDB.12.0'提供程序未在本地计算机上

需要安装Access Database Engine。从这里下载

注意:它需要安装在每台运行你的应用程序的机器上,所以你应该在发布设置中将它作为先决条件的一部分。

我有一个不完美的解决方案,但它有效,其想法是将XLSX文件转换为csv文件,并将其作为csv文件读取,这里的优点是您不必在每台机器上安装提供程序。(在我的例子中,我在DATATABLE中备份了文件的内容),我还使用了电子表格控件(您需要添加引用)下面是代码

     var fileName = @"C:'ExcelFile.xlsx";
 SpreadsheetControl spreadsheetControl1 = new SpreadsheetControl();
 using (FileStream stream = new FileStream(fileName, FileMode.Open))
 {
     spreadsheetControl1.LoadDocument(stream, DocumentFormat.OpenXml);
 }
 IWorkbook workbook = spreadsheetControl1.Document;
 workbook.Options.Export.Csv.ValueSeparator = ';';
 workbook.SaveDocument("d:''test.csv", DocumentFormat.Csv);
 string whole_file = System.IO.File.ReadAllText(FileName);
 // Split into lines.
 whole_file = whole_file.Replace(''n', ''r');
 string[] lines = whole_file.Split(new char[] { ''r' },
     StringSplitOptions.RemoveEmptyEntries);
 // See how many rows and columns there are.
 int num_rows = lines.Length;
 int num_cols = lines[0].Split(',').Length;
 // Allocate the data array.
 string[,] values = new string[num_rows, num_cols];
 // Load the array.
 for (int r = 0; r < num_rows; r++)
 {
     string[] line_r = lines[r].Split(',');
     for (int c = 0; c < num_cols; c++)
         values[r, c] = line_r[c];
         //MessageBox.Show(line_r[c]);
 }
 int end;
 for (int i = 0; i < values.Length; i++)
 {
     int itemcount = values[i, 0].Count(x => x == ';');
     string tmpch = values[i, 0];
     string valeuradd;
     if (i == 0)
     {
         for (int x = 1; x < itemcount + 2; x++)
         {
             end = tmpch.IndexOf(";");
             if (end <= 0) { end = tmpch.Length; }
             valeuradd = tmpch.Substring(0, end);                       
             tmpch = tmpch.Substring(end + 1);                       
             DT.Columns.Add(valeuradd);
         }
     }
     else
     {
         DataRow row;
         row = DT.NewRow();
         for (int j = 1; j < itemcount + 2; j++)
         {
             end = tmpch.IndexOf(";");
             //MessageBox.Show(j.ToString());
             if (end <= 0) { end = tmpch.Length; }
             valeuradd = tmpch.Substring(0, end);
             row[j - 1] = valeuradd;                       
           tmpch = tmpch.Substring(end + 1);                       
         }
         DT.Rows.Add(row);
     }
 }

File.Delete("d: ' test.csv");