2012-01-10 4 views
16

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

[Пересмотренный 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». (Это шаг вперед ?!)

Любые мысли?

+0

ли искали вы SO для этого eeor? Есть много вопросов, которые задают вопрос, большинство ответов, похоже, вращаются вокруг добавления цитат вокруг вашего «Data Source =» ... » –

+0

Да, я потратил несколько часов на поиск SO и в других местах и ​​попробовал много вариантов строки подключения, включая игру с котировками, поэтому я не думаю, что это проблема. (Это включает в себя копирование строки подключения SSIS, которая работает.) –

+0

У меня такая же проблема – Pete

ответ

0

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

Не пропустите этот XML после стандартного материала. (Для чего я также прочитал, что вам нужен« Excel 12.0 Macro »для соединиться с файлом xslm)

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

+2

Первый фрагмент кода выше включает в себя 'Extended Properties =" Excel 12.0 XML; HDR = YES ", который вы предложили, - все еще не работает. –

0

Try This

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

я уже решена с этим запросом:...

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

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

2

TRY это может помочь вам:

установить 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\""; 
    } 
+1

добавление кавычек в расширенные свойства работало для меня (например, это "Provider = Microsoft.ACE.OLEDB.12.0; Источник данных =" + имя файла + "; Расширенные свойства = \" Excel 12.0; HDR = YES; \ "" ;) – pawciu

1

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

Проверьте это: Msg 7302, Level 16, State 1, Line 1 Cannot create an instance of OLE DB Provider “Microsoft.ACE.OLEDB.12.0” for linked server “(null)”

В принципе, вы идете в

Control Panel > Administrative Tools > Component Services

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

Component Services > Computers > My Computer > DCOM Config

найти

MSDAINITIALIZE

пойти

Properties > Security > Launch and Activation Permissions

нажмите на

Customize > Edit...

добавить свое имя пользователя или "Все", если вы предпочитаете

клеща ВСЕ "Allow" коробки для нового пользователя/группы

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

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

Благодаря Ramesh Babu Vavilla (vr.babu) from social.technet.microsoft.com за ссылку

+0

Все элементы управления в «Разрешениях запуска и активации» отключены. –

+1

@Irawan Вам нужно войти в Windows как администратор, чтобы иметь доступ к этим настройкам. Попросите администратора домена получить доступ. –

0
Hai am also faced this situation i solved It

решаемые

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

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

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=NO;Database=C:\temp\file.xlsx;',[sheetname$])