2012-01-10 11 views
16

Próbuję zaimportować dane z plików Excel 2007 (.xlsx) do SQL Server 2008 za pomocą polecenia T-SQL OpenRowset() z "Microsoft.ACE. OLEDB.12.0 "Dostawca OLE DB, a otrzymuję komunikat" Nie można znaleźć instalowalnego ISAM ". Cały sprzęt jest 32-bitowy.Jak rozwiązać problem "Nie można znaleźć instalowalnego modułu ISAM". błąd dla dostawcy OLE DB "Microsoft.ACE.OLEDB.12.0"

[Revised 1/10/12 spróbować silniej koncentrować się na anomaliach]

Poniższe oświadczenie T-SQL generuje błąd:

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$]' 
) 

Gdybym zapisania pliku Excel w formacie "Excel 97-2003" (.xls) i użyj starszego dostawcy Microsoft.Jet.OLEDB.4.0 do importowania danych, działa dobrze. To sprawia, że ​​myślę, że nie jest to kwestia bezpieczeństwa lub innego problemu środowiskowego.

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

Jednak gdy próbuję plik * .xls z dostawcą Microsoft.ACE.OLEDB.12.0, który powinien być kompatybilny wstecz ze formacie * .xls, to znowu nie powiedzie się z powodu tego samego błędu:

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

Co ciekawe, kiedy używam kreatora SSMS "Import danych ...", działa dobrze. Zapisałem dane wyjściowe kreatora danych importu jako pakiet SSIS i zajrzałem do pliku SSIS, aby dowiedzieć się, jak to działa i pomyślnie korzysta z dostawcy Microsoft.ACE.OLEDB.12.0. Jest to ciąg połączenia z pakietu 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> 

Ja również zrobić odpowiednią konfigurację SQL Server aby umożliwić OPENROWSET rozproszoną zapytanie:

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

Gdybym też ustawić następujące * sp_MSset_oledb_prop * wartości (które znalazłem w poście gdzieś) ...

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 

... wtedy zmiany błędach „Nieokreślony błąd”:

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)". 

Jednak nie jestem pewien, czy jest to błąd w górę lub w dół. (Czy obecnie znajduje się "instalowalny moduł ISAM", ale następnie nie działa?)

Próbowałem tego z wieloma plikami Excel na dwóch różnych komputerach/systemach operacyjnych (Windows Server 2003, Windows XP SP3). Obie maszyny są 32-bitowe.

Próbowałem również ponownie zainstalować zarówno wersję Office 2007 i Office 2010 w wersji AccessDatabaseEngine.exe (odpowiednio http://www.microsoft.com/download/en/details.aspx?id=23734 i http://www.microsoft.com/download/en/details.aspx?id=13255), bezskutecznie.

Podsumowując:

  • "Microsoft.Jet.OLEDB.4.0" usługodawca działa za pomocą T-SQL, ale "Microsoft.ACE.OLEDB.12.0" nie.
  • "Microsoft.ACE.OLEDB.12.0" działa za pomocą kreatora "Importuj dane ..." (o ile wiem z zapisanego pliku zadania SSIS).
  • Ustawienie właściwości "AllowInProcess" i "DynamicParameters" na "1" zmienia błąd na "Nieokreślony błąd". (Czy to krok do przodu ?!)

Jakieś myśli?

+0

Czy szukał więc dla tego eeor? Pyta się o to wiele pytań, większość odpowiedzi wydaje się obracać wokół dodawania cytatów do twojego 'Data Source = '...'' –

+0

Tak, spędziłem kilka godzin szukając SO i gdzie indziej, i próbowałem wielu odmian ciągu połączenia, w tym grę z cytatami, więc nie sądzę, że to jest problem. (Obejmuje to kopiowanie działającego ciągu połączenia SSIS.) –

+0

Mam ten sam problem. – Pete

Odpowiedz

0

Myślę, że odpowiedź ukrywa się w opublikowanych informacjach o pakiecie SSIS. Nowy format pliku xlsx przechowuje dane w formacie XML zamiast starego formatu. Spójrz na to jeszcze raz. To czyta ... Rozszerzone właściwości = "Excel 12.0 XML; HDR = TAK

Nie przegap tego XML po standardowych rzeczach. (Co jest warte, czytałem również, że potrzebujesz" Excel 12.0 Macro "do połączyć z plikiem xslm)

spróbować Dziwne, ale mam nadzieję, że to działa

+2

Pierwszy fragment kodu powyżej zawiera "Extended Properties =" Excel 12.0 XML; HDR = YES "", który zasugerowałeś - nadal nie działa. –

0

try to

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

ja już rozwiązany z tego zapytania:...

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

Wydaje SQL nie podoba się w sekcji "Właściwości Extended" ...

2

Spróbuj to może pomóc:

ustawić path i strFileType jak na wymagania

 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

dodawanie cudzysłowów do właściwości rozszerzonych działało dla mnie (podobnie jak to "Dostawca = Microsoft.ACE.OLEDB.12.0; Źródło danych =" + nazwa pliku + "; Właściwości rozszerzone = \" Excel 12.0; HDR = TAK; \ "" ;) – pawciu

1

WRESZCIE, rozwiązanie!

to sprawdzić: 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)”

Zasadniczo, można przejść do

Control Panel > Administrative Tools > Component Services

następnie rozwiń

Component Services > Computers > My Computer > DCOM Config

znaleźć

MSDAINITIALIZE

iść do

Properties > Security > Launch and Activation Permissions

kliknięcie

Customize > Edit...

dodać swój login lub "każdy", jeśli wolisz

Zaznacz wszystkie "Zezwól" pola dla nowego użytkownika/grupy

i uderzyć OK na obu stronach:

Teraz sprawdź, czy działa polecenie OpenRowSet/OpenDataSource

Dzięki Ramesh Babu Vavilla (vr.babu) from social.technet.microsoft.com na link

+0

Wszystkie elementy sterujące w "Uprawnienia uruchamiania i aktywacji" są wyłączone. –

+1

@Irawan Aby uzyskać dostęp do tych ustawień, musisz zalogować się do systemu Windows jako administrator. Poproś administratora domeny o dostęp. –

0
Hai am also faced this situation i solved It

rozwiązać

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

Ten pracował dla mnie:

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