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中描述的组件 我可以采取哪些额外步骤来解决问题或解决此问题? 解决方法
对于第一个问题,请使用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连接字符串! 编辑: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |