System data oledb oledbexception не удается найти файл

Обновлено: 06.07.2024

Для работы с Excel 2003 (.Xls) можно использовать провайдер Microsoft Jet OLE DB 4.0.

Для работы с Excel 2007 (.Xlsx) - Microsoft ACE OLEDB 12.0.

В Windows 10 открыть настройки источников данных ODBC можно написав "Источники данных ODBC" или через Панель управления \ Администрирование.

  • HDR=YES|NO . HDR=YES означает, что первую строку листа, следует рассматривать как заголовки колонок. Т.о. значение из первой строки можно использовать как имена полей в sql запросах (любых: select, insert, update, delete).
  • IMEX=1|3 . 1 - открыть соединение для чтения. 3 - для записи.

Создание Linked Server в Sql Server для доступа к Excel

После создания связанного сервера можно будет просмотреть имена доступных листов.

Затем, чтобы обратиться к сервису:

SELECT * FROM OPENQUERY (XLSX_2010, 'Select * from [Sheet1$]') или SELECT * FROM [XLSX_2010]. [Лист1$]

Обращение к лиcтам, диапазонам, полям

Для обращения к листу из SQL запроса нужно использовать имя листа, например: [Sheet1$] или [Лист1$] . Обращение к диапазону: [Sheet1$A16:F16] .

Вставка данных в произвольное место

Примеры указания диапазона при вставке строк ( insert )

  • [table1$B4:E20]
  • [table1$S4:U]
  • [table1$F:G]

При вставке должны выполняться следующие условия:

  • Первая строчка указанного диапазона дожна входить в диапазон ячеек с данными. Чтобы создать на листе диапазон с данными достаточно в углах некоторого прямоугольного диапазона (в левом верхнем и правом нижнем) вписать значение (C4:I7 на скриншоте). Т.е. сама первая строчка указанного в insert диапазона данные содержать не обязана, достаточно, чтобы она просто входила в такой диапазон. Иначе возникнет ошибка "This table contains cells that are outside the range of cells defined in this spreadsheet"
  • Хвост диапазона должен содержать пустые строки (хотя бы одну).

Пример: Дан лист, где заполнены только 2 ячейки: C4, I7. После выполнения команды INSERT INTO [table1$E6:G] VALUES(2, 'FF','2014-01-03') результат будет как на скриншоте. Поясним: строка E6:G6 является первой строкой диапазона для вставки. Она входит в заполненный диапазон C4:I7. Поэтому данные были вставлены на следующей пустой строке - 8. Из этого примера становится ясно, что через OleDb нельзя работать с несколькими независимыми диапазонами на одном листе, используя вставку ( update будет работать).

Insert

  • System.Data.OleDb.OleDbException (0x80004005): Operation must use an updateable query . Соединение открыто для чтение, при этом происходит попытка внести изменения (выполнить insert, update или delete). Решение: открыть соединение для записи, установив свойство провайдера в строке соединения IMEX=3 (см. выше).
  • System.Data.OleDb.OleDbException (0x80004005): "This table contains cells that are outside the range of cells defined in this spreadsheet" . Такая ошибка возникает при подпытке обновить ( update ) или вставить ( insert ) значения в диапазоне, в котором отсутствуют данные на листе.
    1. Если нужно произвести запись в определенные ячейки инструкцией update, то

Insert-range.jpg

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

This comment has been minimized.

Copy link Quote reply

Spirit412 commented Sep 9, 2019

Спасибо за код. Пригодился.
Не подскажите ли мне, как узнать номер строки у ячейки? Мне нужно циклами SQL обойти таблицу, которая начинается с именованной ячейки.
Значение самой ячейки я получаю так
Set rs = objConn.execute("SELECT * FROM CustomerName")
Т.е. в rs записываю значение из ячейки с именем CustomerName.
Но как мне в переменную записать номер строки этой ячейки?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.


  • FWIW Я получил это на листе Excel, когда пытался открыть его, я использовал текущий ACE и предлагаемые расширенные свойства. Когда я вручную открыл файл, вверху было это приглашение для включения редактирования, мне нужно разобраться, как автоматически перевернуть этот бит, но если вы получаете это, вам может просто нужно открыть файл, а затем включить редактирование . Я могу посмотреть, смогу ли я открыть файл только для чтения, я видел кое-что очень далеко в этой ветке об этом.

Использование следующей строки подключения, похоже, решает большинство проблем.

Спасибо за этот код :) Я очень ценю это. Работает на меня.

Итак, если у вас есть различная версия файла Excel, получите имя файла, если его расширение .xlsx, использовать этот:

и если это .xls, используйте:

  • 5 FYI: это вызовет исключение OleDbException, если вы попытаетесь открыть файл на ПК, на котором нет Jet На нем установил OleDb.
  • @Trex, вы уверены, что ваша последняя строка кода верна? Можешь еще раз перепроверить в каком-нибудь редакторе?

(У меня слишком низкая репутация, чтобы комментировать, но это комментарий к записи JoshCaba, использующей Ace-engine вместо Jet для Excel 2007)

Это также применимо к Excel 2010.

Просто добавь мой случай. Мой файл xls был создан функцией экспорта данных с веб-сайта, расширение файла - xls, его можно нормально открыть в MS Excel 2003. Но и Microsoft.Jet.OLEDB.4.0, и Microsoft.ACE.OLEDB.12.0 получили отметку " Внешняя таблица не соответствует "исключению ожидаемого формата".

У меня такая же проблема. которые разрешены с помощью следующих шагов:

1.) Щелкните Файл

3.) Щелкните раскрывающийся список (Сохранить как тип).


4.) Выберите книгу Excel 97-2003.



  • 1 Бу! Возврат к устаревшему формату файла даже не должен рассматриваться. На момент ответа формату 97-2003 было 16 лет и он устарел на 12 лет. Я мог понять несколько лет, но устаревание более чем на десять лет не должно говорить профессиональному разработчику о том, что формат файла должен быть старше.

У меня была такая же проблема (с использованием ACE.OLEDB), и для меня ее решила эта ссылка:

Суть в том, что установка нескольких офисных версий и различных офисных SDK, сборок и т. Д. Привела к тому, что в реестре ссылка ACEOleDB.dll указывала на папку OFFICE12 вместо OFFICE14 в

C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

Кроме того, вы можете изменить раздел реестра, изменив путь к dll в соответствии с вашей версией Access.

Access 2007 должен использовать OFFICE12, Access 2010 - OFFICE14 и Access 2013 - OFFICE15.

(ОС: 64-разрядная, офисная: 64-разрядная) или (ОС: 32-разрядная, офисная: 32-разрядная)

Ключ: HKCR \ CLSID \ InprocServer32 \

Имя значения: (по умолчанию)

Данные значения: C: \ Program Files \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

(ОС: 64-битная, Офисная: 32-битная)

Ключ: HKCR \ Wow6432Node \ CLSID \ InprocServer32 \

Имя значения: (по умолчанию)

Данные значения: C: \ Program Files (x86) \ Common Files \ Microsoft Shared \ OFFICE14 \ ACEOLEDB.DLL

Я также видел эту ошибку при попытке использовать сложные формулы INDIRECT () на листе, который импортируется. Я заметил это, потому что это была единственная разница между двумя книгами, одна из которых импортировала, а другая - нет. Оба были файлами 2007+ .XLSX, и был установлен движок 12.0.

Я подтвердил, что это проблема:

  • Создание копии файла (проблема все еще была, так что не было никакой разницы в сохранении как)
  • Выбор всех ячеек на листе с помощью косвенных формул
  • Вставка только как значения

и ошибка исчезла.

У меня возникали ошибки при чтении книги XLSX третьей стороной и Oledb. Проблема заключается в скрытом листе, который вызывает ошибку. Отображение рабочего листа позволило импортировать книгу.

Если файл доступен только для чтения, просто удалите его, и он снова заработает.

Заглянул в ту же проблему и нашел эту ветку. Ни одно из приведенных выше предложений не помогло, за исключением комментария @ Smith к принятому ответу 17 апреля 2013 года.

Предыстория моей проблемы достаточно близка к проблеме @ zhiyazw - в основном я пытаюсь установить экспортированный файл Excel (в моем случае SSRS) в качестве источника данных в пакете dtsx. Все, что я сделал, после некоторой возни с этим, переименовал рабочий лист. Это не обязательно должно быть в нижнем регистре, как предложил @Smith.

Я предполагаю, что ACE OLEDB ожидает, что файл Excel будет следовать определенной структуре XML, но каким-то образом службы Reporting Services не знают об этом.

Этот адрес файла Excel может иметь неправильное расширение. Вы можете изменить расширение с xls на xlsx или наоборот и повторить попытку.

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

Рекомендуется сохранить как Excel 2003

Если у вас все еще есть эта проблема, проверьте свои разрешения, я пробовал многие из этих предложений, и моя конкретная проблема заключалась в том, что файл, который я хотел обработать, находился под контролем источника, а поток не имел разрешений, мне пришлось изменить все разрешения для папки и он начал работать (я обрабатывал там много файлов) . Он также соответствует многим предложениям, например, изменить имя файла или проверить, не заблокирован ли файл другим процессом.

Надеюсь, это вам поможет.

Вместо OleDb вы можете использовать Excel Interop и открывать лист только для чтения.

  • 5 Взаимодействие с Excel не рекомендуется для работы с Excel. Это может вызвать множество проблем, поэтому не рекомендуется.
  • Хотя это старый пост, я согласен с MaxOvrdrv, использование взаимодействия - не лучшая идея, и его следует избегать, хотя бы по той причине, что для этого требуется полная установка Excel на сервере.
  • Вы не должны этого делать.

Ace поддерживает все предыдущие версии Office

Этот код работает хорошо!

  • 1 Это не так. Проблема все еще может возникнуть, я еще не выяснил, почему, поскольку все мои файлы из Excel 2007, и некоторые из них работают, некоторые - нет.
  • У вас есть источник для этого утверждения? Сам не знаю, просто интересно. :-)

Это может произойти, если книга защищена паролем. Есть несколько обходных путей для снятия этой защиты, но большинство примеров, которые вы найдете в Интернете, устарели. В любом случае, простое решение - снять защиту книги вручную, в противном случае используйте что-то вроде OpenXML для программного удаления защиты.

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

1) Загрузите файл шаблона (.xlsx) со строкой заголовка. файл создается с использованием openxml и он работает отлично.

2) Загрузите тот же файл без каких-либо изменений из загруженного состояния. Это приведет к ошибке подключения и отказу (соединение OLEDB используется для чтения листа Excel).

Здесь, если данные заполнены, программа работает как положено.

Любой, у кого есть идея, что проблема связана с файлом, в котором мы ее создаем. xml format, если мы откроем его и просто сохраним, преобразуем его в формат Excel, и он работает хорошо.

Есть идеи загрузить Excel с предпочитаемым типом файла?

  • Вы не должны задавать вопросы в своих ответах, если вам нужны ответы на ваш вопрос, задавайте их при необходимости отдельно.

Работая с некоторым более старым кодом, я обнаружил то же общее исключение. Очень сложно отследить проблему, поэтому я подумал, что добавлю сюда, если это поможет кому-то другому.

В моем случае в другом месте проекта был код, открывающий StreamReader в файле Excel. перед OleDbConnection попытался открыть файл (это было сделано в базовом классе).

Итак, в основном мне просто нужно было сначала позвонить в объект StreamReader, а затем я смог успешно открыть соединение OleDb. Это не имело ничего общего ни с самим файлом Excel, ни со строкой OleDbConnection (которую я, естественно, сначала искал).

Я покажу несколько вариантов решения этой проблемы. Но в начале кратко о возникающей проблеме.

Я использовал следующий вариант подключения к базе nookery.accdb

var conn = new OleDbConnection ( @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SQL\nookery.accdb" ) ;

Вам необходимо создать пустой проект и запустить следующий метод:

DataTable table = new OleDbEnumerator ( ) . GetElements ( ) ;

Далее вам необходимо вызвать данным метод и проанализировать информацию.

И изменить целевую платформу в сборке на x86, а потом на x64. Посмотрев в информации под какую сборку у вас будет доступен поставщик.

Покажу на примере первоначально у меня целевая сборка была под Any CPU метод показал следующую информацию :


Посмотрев на информацию мы не обнаруживаем в ней Microsoft.ACE.OLEDB.12.0. Меняем целевую сборку на x86


Как видим результат остался неизменным, переключаемся на x64


Как мы видим появился доступный нам поставщик Microsoft.ACE.OLEDB.12.0 Для этого всего лишь требовалось сменить целевую платформу.



Необходимо так же добавить или установить в диспетчере конфигурации как показано ниже x64

Если выбора x64 нет, в этом окне так же выберите пункт добавить и соответственно добавьте выбор x64.

Так же необходимо поменять в проекте на x64

Вторым решением будет скачать 2007 Office System Driver ссылка

11 комментариев

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

Пустой проект подразумевает создания main метода а соответственно точки входа. Вам достаточно добавить метод с сайта и вызвать его, можно просто скопировать, содержимое метода в метод main и запустить проект. Я вроде как доступно разъяснил на сайте, достаточно вызвать метод представленный на сайте, метод как то можно вызвать иначе без main?

Автору огромная благодарность! Полдня копал как подключить файл ACCDB к Вьюжал студии и наконец понял, где собака порылась 🙂
Провайдер Microsoft.ACE.OLEDB.12.0 доступен в 64битном варианте, а Студия она ж 32х-битная до сих пор. Хочется в дизайн-тайм получить доступ, для этого похоже придётся поставтиь 32хбитный офис. Пичалька. Но автору всё равно спасибо!

Пожалуйста. Рад был помочь!

Спасибо, помогло 🙂
Хотелось из ВижуалСтудии подцепиться к файлу базы данных. Однако, 64-битная винда в паре с 64-битным офиосом показывали фигу. Сделал как автор велел, глянул и поменял офис на 32-битный. Всё заработало! Автору респект.

Репутация: нет
Всего: нет

вообщем говоря Есть до ужаса простая програма с принципом работы: пользователь вводит число в текстБокс, нажимает кнопочку ЧЕК, програма берет первые 5 цифр числа, ищет их в базе Аксцеса, если находит соответствующую ей значение, пихает его в другой текстБокс, и это всё шлётся на принтер.

вообщем это все проводится правильно, но когда, хоть что либо еще изменяеш на форме(1- комбобок и 1-чекбокс, влияю только на то, что напичатается на форме), то вылазит такое исключение.

ПОМОГИ РАЗДУПЛИТСЯ СТО ЭТО ЗА ИСКЛЮЧЕНИЕ, код уже 20 раз пересмотрел и переобдумал, програму пишу 6 месяцев(учусь) всё продумано до мелочей, НО ЧТО ЭТО ТАКОЕ.

System.Data.OleDb.OleDbException: Изменения не были успешно внесены из-за повторяющихся значений в индексе, ключевых полях или связях. Измените данные в поле или полях, содержащих повторяющиеся значения, удалите индекс или переопределите его, чтобы разрешить повторяющиеся значения, и повторите попытку.
в System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
в System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
в System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
в System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
в System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
в GENERAL_KUZKA.KuzjaForm.ADD_nE_without_checking()
в GENERAL_KUZKA.KuzjaForm.btnADD_Click(Object sender, EventArgs e)
в System.EventHandler.Invoke(Object sender, EventArgs e)
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Иногда шаг вперед - это результат хорошего пинка под зад.

Читайте также: