【发布时间】:2010-07-13 06:42:35
【问题描述】:
我正在尝试使用 OleDb 阅读器读取 excel 文件,但无法调试代码,因为此错误仅出现在生产服务器上。这对我来说真的没有意义,有人可以帮助我吗?
从日志中显示的错误如下:
System.Data.OleDb.OleDbException:对象无效或不再设置。 在 System.Data.OleDb.OleDbConnectionInternal.ProcessResults(OleDbHResult 小时) 在 System.Data.OleDb.OleDbConnectionInternal.GetSchemaRowset(Guid 架构,对象 [] 限制) 在 System.Data.OleDb.OleDbConnection.GetOleDbSchemaTable(Guid 架构,对象 [] 限制) 在 System.Data.OleDb.OleDbMetaDataFactory.PrepareCollection(字符串集合名称,字符串 [] 限制,DbConnection 连接) 在 System.Data.ProviderBase.DbMetaDataFactory.GetSchema(DbConnection 连接,字符串集合名称,字符串 [] 限制) 在 System.Data.ProviderBase.DbConnectionInternal.GetSchema(DbConnectionFactory 工厂,DbConnectionPoolGroup poolGroup,DbConnection outerConnection,String collectionName,String[] 限制) 在 System.Data.OleDb.OleDbConnection.GetSchema(字符串集合名称,字符串 [] 限制值) 在 System.Data.OleDb.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(Guid 架构,对象 [] 限制) 在 System.Data.OleDb.OleDbConnection.GetOleDbSchemaTable(Guid 架构,对象 [] 限制) 在 System.Data.OleDb.OleDbMetaDataFactory.PrepareCollection(字符串集合名称,字符串 [] 限制,DbConnection 连接) 在 System.Data.ProviderBase.DbMetaDataFactory.GetSchema(DbConnection 连接,字符串集合名称,字符串 [] 限制) 在 System.Data.ProviderBase.DbConnectionInternal.GetSchema(DbConnectionFactory 工厂,DbConnectionPoolGroup poolGroup,DbConnection outerConnection,String collectionName,String[] 限制) 在 System.Data.OleDb.OleDbConnection.GetSchema(字符串集合名称,字符串 [] 限制值) 在 System.Data.OleDb.OleDbConnection.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 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 常量,OleDbConnection 连接) 在 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions 选项,对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory) 在 System.Data.OleDb.OleDbConnection.Open() 在 REMEC.Library.WatcherServiceCommon.ExcelParserService`1.GetWorkbookWorksheetNames(String connString) in
在测试中模拟这个错误时,线程永远不会停止,这让我假设即使在我的 finally 子句中明确关闭连接之后,所述错误也不会真正关闭连接。
抱歉,代码/文本太长了
【问题讨论】: