微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – OleDbException(0x80004005):未知

我有以下代码( Windows窗体的一部分),它在我的机器上成功连接到Excel文件,但在另一个盒子上失败.

var fd = new OpenFileDialog();
if (fd.ShowDialog() == DialogResult.OK)
{
    var extendedProperties = string.Empty;
    if (fd.FileName.Contains(".xlsx"))
    {
        // excel 2007 xml format file,IMEX = import data as text avoids data conversion errors
        extendedProperties = "Excel 12.0 Xml;IMEX=1";
    }
    else if (fd.FileName.Contains(".xls"))
    {
        // excel 2003 format file,IMEX: import data as text avoids data conversion errors
        extendedProperties = "Excel 8.0;IMEX=1";
    }

    var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fd.FileName + "';Extended Properties='" + extendedProperties + "'";
    using (var objXConn = new OleDbConnection(connectionString))
    {
        objXConn.open();

        var selectStatement = string.Format("SELECT * FROM [tabName$] WHERE FormType IS NOT NULL");
        var dataTable = new DataTable("test");
        using (var objCommand = new OleDbCommand(selectStatement,objXConn))
        {
            var dataReader = objCommand.ExecuteReader();
            if (dataReader != null)
            {
                dataTable.Load(dataReader);
            }
        }
        using (var stringWriter = new StringWriter())
        {
            dataTable.WriteXml(stringWriter);
            this.textBox1.Text = stringWriter.ToString();
        }
    }
}

使用OleDbDataAdapter而不是OleDbCommand.ExecuteReader()可以重现该行为.

using (var dataAdapter = new OleDbDataAdapter(selectStatement,objXConn))
{
    dataAdapter.Fill(dataTable);
}

失败,我的意思是在dataTable.Load(dataReader)行上发生以下错误;

使用x86配置运行/构建程序时,出现以下错误.

System.Data.OleDb.OleDbException (0x80004005): UnkNown
   at System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr)
   at System.Data.OleDb.OleDbDataReader.GetRowHandles()
   at System.Data.OleDb.OleDbDataReader.ReadRowset()
   at System.Data.OleDb.OleDbDataReader.Read()
   at System.Data.Common.DataAdapter.FillLoadDaTarow(SchemaMapping mapping)
   at System.Data.Common.DataAdapter.FillFromreader(DataSet dataset,DataTable datatable,String srcTable,DataReaderContainer dataReader,Int32 startRecord,Int32 maxRecords,DataColumn parentChapterColumn,Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables,IDataReader dataReader,Int32 maxRecords)
   at System.Data.Common.LoadAdapter.FillFromreader(DataTable[] dataTables,Int32 maxRecords)
   at System.Data.DataTable.Load(IDataReader reader,LoadOption loadOption,FillErrorEventHandler errorHandler)
   at ExcelTest.Form1.button1_Click(Object sender,EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.onmouseup(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m,MouseButtons button,Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

使用Anycpu / x64配置运行/构建程序时,我在两台计算机上都出现以下错误.

system.invalidOperationException: The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
   at System.Data.OleDb.OleDbServicesWrapper.GetDataSource(OleDbConnectionString constr,DataSourceWrapper& datasrcWrapper)
   at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr,OleDbConnection connection)
   at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionoptions options,DbConnectionPoolKey poolKey,Object poolGroupProviderInfo,DbConnectionPool pool,DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup,DbConnectionoptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,taskcompletionsource`1 retry,DbConnectionoptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,DbConnectionoptions userOptions)
   at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)
   at System.Data.OleDb.OleDbConnection.open()
   at ExcelTest.Form1.button1_Click(Object sender,EventArgs e)
   at System.Windows.Forms.Button.onmouseup(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m,Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,IntPtr lparam)

用于测试的Excel文件在两台计算机上都是相同的文件.我已经能够使用多个文件(.xls ans .xlsx)重现该问题.

我已经尝试了以下方法解决这个问题.

>安装‘Microsoft.ACE.OLEDB.12.0’ provider is not registered on the local machine中描述的组件
>将项目配置为x86 / x64
>卸载并重新安装2007 Office System Driver: Data Connectivity Components
>卸载并重新安装Microsoft Access Database Engine 2010 Redistributable

我可以采取哪些额外步骤来解决问题或解决此问题?

解决方法

对于第一个问题,请使用OleDbDataAdapter和Fill()方法或Update().

DataTable newTbl = new DataTable()
        using(OleDbDataAdapter ad = new OleDbDataAdapter(
            @"SELECT * FROM [tabName$] WHERE FormType IS NOT NULL",objXConn))
        {
           OleDbCommandBuilder builder = new OleDbCommandBuilder(ad);

           builder.QuotePrefix = "[";
           builder.QuoteSuffix = "]";

           // Saves the data set
           ad.Update(newTbl);
        }

用于32位和64位应用的OLEDB驱动程序是不同的.

如果您只安装了32位驱动程序,则64位应用程序尝试使用它将收到此错误:Microsoft.ACE.OLEDB.12.0’提供程序未在本地计算机上注册.同样,如果您只安装了64位版本并且32位应用程序尝试使用它,则会出现此错误.

要了解发生了什么,您应该检查您的应用程序是什么.我认为这一行可以提供帮助:Environment.Is64BitProcess

如果xls(Excel 2003)文件出现问题,请尝试使用JET连接字符串!

编辑:
以下是drivers链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐