Как разрешить "Не удалось найти устанавливаемый ISAM". ошибка для поставщика OLE DB "Microsoft.ACE.OLEDB.12.0"
Я пытаюсь импортировать данные из файлов 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
... тогда ошибка изменится на "Unspecified error":
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". (Это шаг вперед?!)
Любые мысли?
Ответы
Ответ 1
ПОПРОБУЙТЕ это, это может вам помочь:
установите 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\"";
}
Ответ 2
Я думаю, что ответ скрывается в информации о пакете SSIS, которую вы опубликовали. Новый формат файла xlsx хранит данные в формате XML вместо старого. Посмотрите на это снова. Он читает...
Расширенные свойства = "Excel 12.0 XML; HDR = YES
Не пропустите этот XML после стандартного материала. (Для чего это стоит, я также прочитал, что вам нужно "Excel 12.0 Macro" для подключения к файлу xslm.)
Попробуй. Странно, но, надеюсь, это работает.
Ответ 3
Попробуйте это
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$])
Ответ 4
Я решил с этим запросом:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=NO;Database=D:\Filename.xlsx;',
[SheetName$])
Кажется, sql не нравится раздел "Расширенные свойства"...
Ответ 5
НАКОНЕЦ, решение!
Проверьте это: Msg 7302, уровень 16, состояние 1, строка 1 Невозможно создать экземпляр поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "(null)"
В принципе, вы переходите к
Панель управления > Администрирование > Службы компонентов
затем разверните
Службы компонентов > Компьютеры > Мой компьютеp > Конфигурация DCOM
находка
MSDAINITIALIZE
перейдите к
Свойствa > Безопасность > Разрешения запуска и активации
нажмите
Настроить > Изменить...
добавьте свое имя пользователя или "все", если вы предпочитаете
отметьте ВСЕ поля "разрешить" для нового пользователя/группы
и нажмите ОК на обеих страницах
Теперь посмотрите, работает ли ваша команда OpenRowSet/OpenDataSource
Благодаря Ramesh Babu Vavilla (vr.babu) с сайта social.technet.microsoft.com для ссылки
Ответ 6
Хай также столкнулся с такой ситуацией, я решил ее
решаемые
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>
Ответ 7
Это сработало для меня:
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])
Ответ 8
Обеспечение цитат вокруг расширенного раздела свойств строки подключения исправило это для меня. Я добавил дополнительное свойство и не перенес цитату до конца после моего нового свойства.
Ответ 9
Это сработало для меня
Select *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'text;
HDR=yes;
imex=1;
driver={Microsoft text Driver (*.xls, *.xlsx, *.xlsm, *.xlsb,*.csv)};
extended properties=excel 12.0 xml;
Database=<path>\',
'SELECT * from [<filename>#csv]')
Ответ 10
Если вы делаете весь этот пост и продолжаете с т.е. ошибкой.
попробуйте назначить разрешение на папку pdf, аккаунту
NT Service\MSSQLSERVER
NT Service\SQLSERVERAGENT
у меня работает