Как решить "Не удалось найти устанавливаемый ISAM".ошибка для поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" - PullRequest
18 голосов
/ 10 января 2012

Я пытаюсь импортировать данные из файлов Excel 2007 (.xlsx) в SQL Server 2008 с помощью команды T-SQL OpenRowset () с поставщиком OLE DB «Microsoft.ACE.OLEDB.12.0», и я получаю постоянная ошибка «Не удалось найти устанавливаемый ISAM». Все оборудование 32-битное.

[Пересмотрено 1/10/12, чтобы попытаться сфокусироваться более резко на аномалиях]

Следующая инструкция T-SQL выдает ошибку:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"',
    'SELECT * FROM [Sheet1$]'
)

Если я сохраню файл Excel в формате «Excel 97-2003» (.xls) и использую более старый поставщик Microsoft.Jet.OLEDB.4.0 для импорта данных, он работает просто отлично. Это заставляет меня думать, что это не проблема безопасности или другая экологическая проблема.

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]'
)

Однако, когда я пробую файл * .xls с поставщиком Microsoft.ACE.OLEDB.12.0, который должен быть обратно совместим с форматом * .xls, он снова завершается с той же ошибкой:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";', 
    'SELECT * FROM [Sheet1$]'
)

Кроме того, интересно, когда я использую мастер SSMS «Импорт данных ...», он работает нормально. Я сохранил выходные данные мастера импорта данных в виде пакета служб SSIS и посмотрел в файле служб SSIS, чтобы попытаться выяснить, как он работает, и он успешно работает с использованием поставщика Microsoft.ACE.OLEDB.12.0. Это строка подключения из пакета служб SSIS:

<DTS:Property DTS:Name="ConnectionString">
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
</DTS:Property>

Я также выполнил соответствующую настройку SQL Server, чтобы разрешить распределенный запрос OPENROWSET:

sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO

Если я также установлю следующие значения * sp_MSset_oledb_prop * (которые я где-то нашел в посте) ...

USE [master] 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO 

... тогда ошибка изменится на «Неуказанная ошибка»:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

Однако я не уверен, является ли это ошибкой в ​​восходящем или нисходящем направлении. (Теперь он находит «устанавливаемый ISAM», но впоследствии не работает?)

Я пробовал это с несколькими файлами Excel на двух разных машинах / ОС (Windows Server 2003, Windows XP SP3). Обе машины 32-битные.

Я также пытался переустановить версии AccessDatabaseEngine.exe для Office 2007 и Office 2010 (http://www.microsoft.com/download/en/details.aspx?id=23734 и http://www.microsoft.com/download/en/details.aspx?id=13255, соответственно), но безрезультатно.

Подведем итог:

  • Поставщик «Microsoft.Jet.OLEDB.4.0» работает с использованием T-SQL, а «Microsoft.ACE.OLEDB.12.0» - нет.
  • «Microsoft.ACE.OLEDB.12.0» работает с помощью мастера «Импорт данных ...» (насколько я могу судить по сохраненному файлу задания SSIS).
  • Установка свойств «AllowInProcess» и «DynamicParameters» на «1» заменяет ошибку на «Unspecified error». (Это шаг вперед?!)

Есть мысли?

Ответы [ 9 ]

1 голос
/ 30 января 2014

ПОПРОБУЙТЕ это может помочь вам:

установить path и strFileType согласно требованию

      string connString = "";
//    string strFileType = Path.GetExtension(UpfileName.FileName).ToLower();
//    string path = UpfileName.PostedFile.FileName;

if (strFileType.Trim() == ".xls")
   {

      connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
   }
   else if(strFileType.Trim() == ".xlsx")
    {
            connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
    }
0 голосов
/ 30 июля 2018

Если вы делаете весь этот пост и продолжаете с ошибкой. попробуйте назначить разрешение на папку pdf, аккаунту

NT Service\MSSQLSERVER
NT Service\SQLSERVERAGENT

у меня работает

0 голосов
/ 11 июля 2018

Обеспечение цитат вокруг расширенного раздела свойств строки подключения исправило это для меня. Я добавил дополнительное свойство и не перенес цитату в конец после моего нового свойства.

0 голосов
/ 18 июля 2017

Это сработало для меня:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
   'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])
0 голосов
/ 17 сентября 2014
Хай также столкнулся с этой ситуацией, я решил

решаемые

string ConeectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFlp.Text 

    + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");

                OleDbConnection oconn = new OleDbConnection(ConeectionString);</b>
0 голосов
/ 19 мая 2014

НАКОНЕЦ, решение!

Проверьте это: Сообщение 7302, уровень 16, состояние 1, строка 1 Не удается создать экземпляр поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(ноль)»

По сути, вы идете на

Панель управления> Администрирование> Службы компонентов

затем разверните

Службы компонентов> Компьютеры> Мой компьютер> DCOM Config

найти

MSDAINITIALIZE

перейти к

Свойства> Безопасность> Разрешения на запуск и активацию

нажмите на

Настройка> Редактировать ...

добавьте ваш логин или "Все", если вы предпочитаете

отметьте ВСЕ поля «Разрешить» для нового пользователя / группы

и нажмите OK на обеих страницах

Теперь посмотрим, работает ли ваша команда OpenRowSet / OpenDataSource

Спасибо Рамешу Бабу Вавилле (vr.babu) из social.technet.microsoft.com за ссылку

0 голосов
/ 29 мая 2013

Я решил этот запрос:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;', 
    [SheetName$])

Кажется, sql не нравится раздел "Расширенные свойства" ...

0 голосов
/ 26 февраля 2013

Попробуйте

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                'EXCEL 12.0;DataBase=C:\TEMP\test.xlsx;Extended Properties="EXCEL 12.0 Xml;HDR=YES', [Sheet1$])
0 голосов
/ 27 апреля 2012

Я думаю, что ответ скрыт в информации о пакете служб SSIS, которую вы разместили. Новый формат файла xlsx сохраняет данные в формате XML вместо старого формата. Посмотри на это еще раз. Это читает ... Расширенные свойства = "Excel 12.0 XML; HDR = ДА

Не пропустите этот XML после стандартных вещей. (Я также прочитал, что для подключения к файлу xslm вам необходим «Макрос Excel 12.0».)

Дай ему попробовать. Странно, но, надеюсь, это сработает.

...