Недопустимый объект OleDb или больше набор

Я пытаюсь считать файл Excel с помощью Читателя OleDb, я не мог отладить код, потому что эта ошибка только выходит на рабочем сервере. Это действительно не имеет смысла мне, кто-либо мог помочь мне?

От журналов ошибка выходит как:

Система. Данные. OleDb. OleDbException: Возразите недопустимый или больше набор. в System. Данные. OleDb. OleDbConnectionInternal. ProcessResults (час OleDbHResult) в System. Данные. OleDb. OleDbConnectionInternal. GetSchemaRowset (Схема гуида, Объект [] ограничения) в System. Данные. OleDb. OleDbConnection. GetOleDbSchemaTable (Схема гуида, Объект [] ограничения) в System. Данные. OleDb. OleDbMetaDataFactory. PrepareCollection (Представляют collectionName в виде строки, Строка [] ограничения, соединение DbConnection) в System. Данные. ProviderBase. DbMetaDataFactory. GetSchema (соединение DbConnection, Строка collectionName, Строка [] ограничения) в System. Данные. ProviderBase. DbConnectionInternal. GetSchema (фабрика DbConnectionFactory, DbConnectionPoolGroup poolGroup, DbConnection outerConnection, Строка collectionName, Строка [] ограничения) в System. Данные. OleDb. OleDbConnection. GetSchema (Представляют collectionName в виде строки, Строка [] restrictionValues) в System. Данные. OleDb. OleDbConnection. GetSchema (Представляют collectionName в виде строки),

Кроме того, некоторое время прежде чем эта ошибка появилась, у меня был a

Система. AccessViolationException: Предпринятый для чтения или защищенная от записи память. Это часто - признак, что другая память повреждена. в System. Данные. Распространенный. UnsafeNativeMethods. IDBSchemaRowset. GetRowset (IntPtr pUnkOuter, Guid& rguidSchema, Int32 cRestrictions, Объект [] rgRestrictions, Guid& riid, Int32 cPropertySets, IntPtr rgPropertySets, IRowset& ppRowset) в System. Данные. OleDb. OleDbConnectionInternal. GetSchemaRowset (Схема гуида, Объект [] ограничения) в System. Данные. OleDb. OleDbConnection. GetOleDbSchemaTable (Схема гуида, Объект [] ограничения) в System. Данные. OleDb. OleDbMetaDataFactory. PrepareCollection (Представляют collectionName в виде строки, Строка [] ограничения, соединение DbConnection) в System. Данные. ProviderBase. DbMetaDataFactory. GetSchema (соединение DbConnection, Строка collectionName, Строка [] ограничения) в System. Данные. ProviderBase. DbConnectionInternal. GetSchema (фабрика DbConnectionFactory, DbConnectionPoolGroup poolGroup, DbConnection outerConnection, Строка collectionName, Строка [] ограничения) в System. Данные. OleDb. OleDbConnection. GetSchema (Представляют collectionName в виде строки, Строка [] restrictionValues) в System. Данные. OleDb. OleDbConnection. GetSchema (Представляют 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. Данные. OleDb. OleDbConnectionInternal.. ctor (OleDbConnectionString constr, соединение OleDbConnection) в System. Данные. OleDb. OleDbConnectionFactory. CreateConnection (опции DbConnectionOptions, Объект poolGroupProviderInfo, пул DbConnectionPool, DbConnection owningObject) в System. Данные. ProviderBase. DbConnectionFactory. CreateNonPooledConnection (DbConnection owningConnection, DbConnectionPoolGroup poolGroup) в System. Данные. ProviderBase. DbConnectionFactory. GetConnection (DbConnection owningConnection) в System. Данные. ProviderBase. DbConnectionClosed. OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory) в System. Данные. OleDb. OleDbConnection. Открытый () в REMEC.Library. WatcherServiceCommon. ExcelParserService '1. GetWorkbookWorksheetNames (Представляют connString в виде строки) в

И при моделировании этой ошибки под тестом, поток никогда не останавливается, заставляя меня предположить, что упомянутая ошибка на самом деле не закрывает соединение даже после явного закрытия его на моем наконец пункт.

Извините за длинные блоки кода/текста

1
задан Jonn 12 July 2010 в 22:42
поделиться

1 ответ

Возможно - проблема с ConnStr Value;
Попробуйте так:

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();
    }
  }
}
2
ответ дан 2 September 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: