sql >> Database teknologi >  >> RDS >> Sqlserver

32-bit Excel og 64-bit SQL Server

Hvad kunne være nemmere end at hente data fra en Excel-tabel i SQL Server?

Der er mange måder at udføre denne opgave på. Du kan bruge Integrationstjenester (tidligere DTS) eller import og eksport wizard, som er den samme under motorhjelmen. En anden måde er at oprette en simpel ADO.NET-app . Du kan bruge den Linkede server mekanisme, som giver dig mulighed for at se ethvert ODBC / OLE DB-tilgængeligt objekt i form af en tabel (en samling af tabeller) eller resultatet af en ad hoc-forespørgsel.

Det havde været, indtil 64-bit-arkitekturen holdt op med at være noget fra hi-end-klassen og kom til udviklerne og brugernes bærbare computere. Det er usandsynligt, at en typisk bruger installerer en databaseserver, mens det er normalt for en udvikler at have en 64-bit SQL Server på en 64-bit maskine med 32-bit MS Office. Men i dette tilfælde kan det være en udfordring at bruge Excel eller Access med SQL Server-linkede servere, fordi drivere er 32-bit. Der er ingen tilgængelige udbydere til MS Office, selvom jeg har en installeret på min pc.

Således vil et forsøg på at bruge Excel eller Access med SQL Server-linkede servere, som beskrevet i dokumentationen, forårsage følgende fejl:

Besked 7302, niveau 16, tilstand 1, linje 1

Kan ikke oprette en forekomst af OLE DB-udbyder «Microsoft.ACE.OLEDB.12.0» for linket server...

Så hvad skal man gøre?

Installer 64-bit udbyder, som er tilgængelig til download på Microsoft Access Database Engine 2010 Redistributable. Vi får følgende fejl under installationsprocessen:

Hvis 32-bit Office ikke var installeret på computeren, ville du ikke få denne advarsel.

Skal jeg vælge mellem 64-bit eller 32-bit version af MS Office og 64-bit eller 32-bit version af SQL Server? At afinstallere én version og installere en anden er ikke en fleksibel løsning. Desuden er det ikke altid muligt. Lad os se på det spørgsmål, en person har rejst på MSDN:

MS Access-databasen er et produktionsmiljø på kundens websted, og det er ikke en mulighed for mig at afinstallere den og installere en 64-bit version. Det er heller ikke en mulighed at afinstallere den eksisterende SQL Server 64 bit og selvfølgelig installere 32 bit versionen. En yderligere installation af en SQL Server 32 bit, kun at give linket til MS Access ville være den eneste mulighed. Jeg synes, det er ret forfærdeligt.

Jeg forstår ikke denne del.

Da der ikke er nogen 64-bit Jet, skal du downloade og installere 64-bit versionen af ​​«Microsoft Access Database Engine 2010 Redistributable». Tak for dit svar, men når jeg installerer AccessDatabaseEngine_X64.exe får jeg følgende fejl (billede 1) Se venligst denne KB-artikel: support.microsoft.com/kb/2269468 Artiklen i linket i din sidste besked fortæller, at du skal afinstallere alle Office 32 bit-produkter. Det giver ingen mening for mig, fordi målet er at oprette forbindelse til 32-bit MS Access-databasen... Du skal installere 64-bit versionen af ​​"Microsoft ACE OLEDB Provider" for at oprette forbindelse til en Access-fil (32-bit eller 64-bit) fra SQL Server. Men jeg prøvede at installere 64 bit driveren, men det giver mig en installationsfejl... Den tidligere KB-artikel forklarer årsagen og giver løsningen, du kan henvise til den. Du guider mig i cirkler.

Nå, problemet er at få 64-bit-versionen af ​​Microsoft ACE OLEDB Provider til at fungere med 32-bit Office. Hvorfor det ikke er muligt at gøre dette direkte er et stort spørgsmål. Der er mange oplysninger om dette emne:

Det faktum, at de ikke kan tvinge os til at kompilere to forskellige versioner af vores applikation; en specifikt til x86 platform og en til x64 platform. Så skal vi på en eller anden måde bestemme, hvilken version af ACE-driveren der er installeret, så vi ved hvilken version (32 eller 64 bit) af vores applikation, der skal installeres. Livet ville være meget enklere, hvis vi bare kunne kompilere vores app til standard AnyCPU, og så fik både 32 og 64 dataudbydere lov til at blive installeret... Hvorfor kan 32 og 64 bit ACE ikke eksistere side om side? Det er baseret på det faktum, at Microsoft ikke understøtter side-by-side-installation af 32 og 64-bit Microsoft Office 2010 eller deres afhængige komponenter... Jeg beklager, men det er ikke et meget nyttigt svar på spørgsmålet. Sp:Hvorfor kan 32 og 64 bit versionerne af Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe og AccessDatabaseEngine_X64.exe) ikke begge installeres på den samme maskine? A:Microsoft understøtter ikke side-by-side-installation af 32 og 64-bit Microsoft Office 2010. Det svarer ikke, det er bare at gentage spørgsmålet med andre ord. Q:Hvorfor kan jeg ikke gøre dette? A:Fordi vi ikke støtter det. Q:Hvorfor kan du ikke støtte det? A:Fordi vi ikke støtter det.

Som en løsning brugte jeg AccessDatabaseEngine_X64.exe med den /passive nøgle, der tillader 64-bit version af udbyderen at eksistere sammen med 32-bit Office-versionen. Det skal bemærkes, at Microsoft ikke understøtter denne metode officielt. Derudover er der advarsler om mulige problemer med kompatibiliteten.

Da jeg installerede driveren AccessDatabaseEngine_x64.exe ... MS Office Pro Plus starter en MS-konfigurationsproces, der kan tage op til et minut eller to, før et dokument eller Office-program åbner . Hvis office 2010 32 bit er installeret, og hvis 64-bit ace er installeret med /passiv , så **hver** gang du kører Access 2010, får du en automatisk installationsrutine, der nulstilles til 32-bit driverne til office .

I mit tilfælde (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1) var der ingen synlige problemer (bank på træ). Alligevel vil jeg gerne tilføje, at det er som det er og uden nogen forpligtelser.

Download AccessDatabaseEngine_x64.exe, opret systemgendannelsespunkt (det ser ud til at blive oprettet automatisk ved opdatering af Office-komponenter) og kør fra kommandolinjen. Her er de mulige nøgler:

I modsætning til billede 2 køres installationen

Klik derefter på Opdater i genvejsmenuen Udbydere:

Jeg oprettede en simpel xslx-fil meget hurtigt:

I SQL Server skal du oprette en linket server på denne Excel:

hvis eksisterer (vælg 1 fra sys.servers hvor navn ='XlsLnkSrv') exec sp_dropserver @server ='XlsLnkSrv', @droplogins ='droplogins'exec sp_addlinkedserver @server ='XlsLnkSrv', @srvproduct ='ACE 12.0 , @provider ='Microsoft.ACE.OLEDB.12.0', @datasrc ='C:\Temp\Sample.xlsx', @provstr ='Excel 12.0; HDR=Ja'

Script 1

Læs:

vælg * fra openquery (XlsLnkSrv, 'Vælg * fra [Sheet1$]')

Script 2

Er det vellykket? Nej!

Msg 7399, Level 16, State 1, Line 1
OLE DB-udbyderen «Microsoft.ACE.OLEDB.12.0» for linket server «XlsLnkSrv» rapporterede en fejl. Udbyderen gav ingen oplysninger om fejlen.
Besked 7303, niveau 16, tilstand 1, linje 1
Kan ikke initialisere datakildeobjektet for OLE DB-udbyderen «Microsoft.ACE.OLEDB.12.0» for linket server «XlsLnkSrv».

Alligevel lykkes det!

Ligeledes

vælg * fra openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Vælg * fra [Sheet1$]') 

I første omgang skal vi gøre følgende:

exec sp_configure 'vis avancerede indstillinger', 1;reconfigure;exec sp_configure 'Ad Hoc Distributed Queries', 1;reconfigure

Script 3

Afslutningsvis vil jeg gerne bemærke, at 64-bit udbyderen erstattede 32-bit. Hvis vi opretter en forbindelse til Sample.xslsx i Data Flow i DTS-pakken, får vi en initialiseringsfejl af Microsoft Office 12.0 Access Database Engine OLE DB Provider, hvilket er logisk korrekt, da devenv.exe er 32-bit, mens udbyderen er 64-bit. For at gendanne adfærden er det nødvendigt at gendanne 32-bit Office-udbyderen (her). Men i dette tilfælde kan vi ikke bruge den linkede server. Gå til begyndelsen af ​​artiklen for at få den linkede server til at fungere.


  1. Brug for en datetime-kolonne i SQL Server, der automatisk opdateres, når posten ændres

  2. JSON_ARRAY() Funktion i Oracle

  3. ÆNDRINGSTABEL i MySQL:Ven eller fjende?

  4. Sådan kontrolleres MySQL-databasestørrelse i Linux