OleDb对象无效或不再设置

我正在尝试使用OleDb阅读器读取excel文件,我无法debugging代码,因为此错误只在生产服务器上出现。 这对我来说真的没有意义,有人能帮助我吗?

从日志中发现错误为:

System.Data.OleDb.OleDbException:对象无效或不再设置。 System.Data.OleDb.OleDb.OleDbConnectionInternal.ProcessResults(OleDbHResult hr)在System.Data.OleDb.OleDbConnectionInternal.GetSchemaRowset(Guid schema,Object [] constraints)在System.Data.OleDb.OleDbConnection.GetOleDbSchemaTable(Guid schema,Object []限制)在System.Data.OleDb.OleDbMetaDataFactory.PrepareCollection(String collectionName,String []限制,DbConnection连接)在System.Data.ProviderBase.DbMetaDataFactory.GetSchema(DbConnection连接,stringcollectionName,String []限制)在System.Data (System.Data.OleDb)上的System.Data.OleDb.OleDbConnection.GetSchema(String collectionName,String [] restrictionValues).ProviderBase.DbConnectionInternal.GetSchema(DbConnectionFactory factory,DbConnectionPoolGroup poolGroup,DbConnection outerConnection,String collectionName,String [] restrictions) OleDbConnection.GetSchema(String collectionName)

另外,在这个错误出现之前的一段时间,我有一个

System.AccessViolationException:试图读取或写入受保护的内存。 这通常表示其他内存已损坏。 System.Data.Common.UnsafeNativeMethods.IDBSchemaRowset.GetRowset(IntPtr pUnkOuter,Guid&rguidSchema,Int32 cRestrictions,Object [] rgRestrictions,Guid&riid,Int32 cPropertySets,IntPtr rgPropertySets,IRowset&ppRowset)System.Data.OleDb.OleDbConnectionInternal.GetSchemaRowset在System.Data.OleDb.OleDbMetaDataFactory.PrepareCollection(String collectionName,String []限制,DbConnection连接)在System.Data.OleDb.OleDbConnection.GetOleDbSchemaTable(Guid架构,对象[]限制)Guid架构,对象[]限制) System.Data.ProviderBase.DbMetaDataFactory.GetSchema(DbConnection连接,stringcollectionName,string[]限制)在System.Data.ProviderBase.DbConnectionInternal.GetSchema(DbConnectionFactory工厂,DbConnectionPoolGroup poolGroup,DbConnection外部连接,stringcollectionName,string[]限制)在System.Data.OleDb.OleDbConnection.GetSchema(String collectionName,String [] restrictionValues)at System.Data.OleDb.OleDbConnect ction.GetSchema(String collectionName)

也是例外。 我不知道他们是否有关系。 任何人都可以指向正确的方向吗?

我用来读取文件的代码是

DateTime start = DateTime.Now; IEnumerable<string> worksheetNames = GetWorkbookWorksheetNames( connString ); using ( OleDbConnection connection = new OleDbConnection( connString ) ) { connection.Open(); foreach ( string worksheetName in worksheetNames ) { using ( OleDbCommand command = new OleDbCommand( "SELECT * FROM [" + worksheetName + "]", connection ) ) { TEntity entity; using ( OleDbDataReader dataReader = command.ExecuteReader() ) { while ( dataReader.Read() ) { entity = GetDataFromDataTable( dataReader ); if ( entity != null ) { entityList.Add( entity ); } } } } } connection.Close(); 

GetWorkbookWorksheetNames包含

 private IEnumerable<string> GetWorkbookWorksheetNames( string connString ) { LogUtil.Info( "Getting workbook worksheet names" ); OleDbConnection _connection = new OleDbConnection( connString ); List<string> _tableNames = new List<string>(); try { // Error Handle _connection.Open(); // Gets the worksheet names DataTable _excelSchema = _connection.GetSchema( "Tables" ); if ( _excelSchema.Rows.Count < 1 ) { throw new FormatException( "The file is in an invalid format. No worksheets were found." ); } foreach ( DataRow _excelSchemaRow in _excelSchema.Rows ) { _tableNames.Add( Regex.Replace( (string)_excelSchemaRow["TABLE_NAME"], "_$", "" ) ); } } catch ( OleDbException ex ) { LogUtil.Error( "Could not get Workbook Worksheet names." ); LogUtil.Error( ex ); throw ex; } finally { _connection.Close(); } return _tableNames; } 

我敢肯定,错误没有得到GetDataFromDataTable()

编辑:我使用的连接string是:

  string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + "Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";"; 

我还发现,在我的日志里又回到了另一个对我毫无意义的错误。 我没有注意到这一点,但它发生在AccessViolationException之前。

没有可用的错误消息,结果代码:E_UNEXPECTED(0x8000FFFF)。 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr,OleDbConnection连接)在System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions选项,对象poolGroupProviderInfo,DbConnectionPool池,DbConnection拥有对象)在System.Data.ProviderBase.DbConnectionFactory。 (System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)System.Data.OleDb.OleDbConnection.Open()上的System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)上的CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup) )在REMEC.Library.WatcherServiceCommon.ExcelParserService`1.GetWorkbookWorksheetNames(String connString)in

而在testing下模拟这个错误,线程永远不会停止,让我假设说,即使在我的finally子句显式closures连接后,所述错误并没有真正closures连接。

对不起,代码/文本的长块

可能 – 意义价值问题;
尝试这个:

private String [] GetExcelSheetNames(string excelFile){OleDbConnection objConn = null; System.Data.DataTable dt = null;

  try { // Connection String. Change the excel file to the file you // will search. String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";Extended Properties=Excel 8.0;"; // Create connection object by using the preceding connection string. objConn = new OleDbConnection(connString); // Open connection with the database. objConn.Open(); // Get the data table containg the schema guid. dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if(dt == null) { return null; } String[] excelSheets = new String[dt.Rows.Count]; int i = 0; // Add the sheet name to the string array. foreach(DataRow row in dt.Rows) { excelSheets[i] = row["TABLE_NAME"].ToString(); i++; } // Loop through all of the sheets if you want too... for(int j=0; j < excelSheets.Length; j++) { // Query each excel sheet. } return excelSheets; } catch(Exception ex) { return null; } finally { // Clean up. if(objConn != null) { objConn.Close(); objConn.Dispose(); } if(dt != null) { dt.Dispose(); } } }