sql >> Database >  >> RDS >> Sqlserver

32-bits Excel en 64-bits SQL Server

Wat is er eenvoudiger dan gegevens uit een Excel-tabel in SQL Server te halen?

Er zijn veel manieren om deze taak te volbrengen. U kunt gebruikmaken van Integratieservices (voorheen DTS) of import en export wizard, die hetzelfde is onder de motorkap. Een andere manier is om een ​​eenvoudige ADO.NET-app . te maken . U kunt de Gelinkte server . gebruiken mechanisme waarmee u elk ODBC / OLE DB-bereikbaar object kunt zien in de vorm van een tabel (een verzameling tabellen) of het resultaat van een ad-hocquery.

Het was totdat de 64-bits architectuur niet langer iets uit de high-end klasse was en naar de ontwikkelaars en gebruikerslaptops kwam. Het is onwaarschijnlijk dat een typische gebruiker een databaseserver installeert, terwijl het normaal is dat een ontwikkelaar een 64-bits SQL-server heeft op een 64-bits machine met 32-bits MS Office. In dit geval kan het gebruik van Excel of Access met gekoppelde SQL Server-servers echter een uitdaging zijn omdat de stuurprogramma's 32-bits zijn. Er zijn geen providers beschikbaar voor MS Office, hoewel ik er wel een op mijn pc heb geïnstalleerd.

Dus een poging om Excel of Access te gebruiken met SQL Server-gekoppelde servers, zoals beschreven in de documentatie, zal de volgende fout veroorzaken:

Bericht 7302, niveau 16, staat 1, regel 1

Kan geen instantie maken van OLE DB-provider «Microsoft.ACE.OLEDB.12.0» voor gekoppelde server…

Dus, wat te doen?

Installeer de 64-bits provider, die kan worden gedownload op Microsoft Access Database Engine 2010 Redistributable. We krijgen de volgende foutmelding tijdens het installatieproces:

Als 32-bits Office niet op de computer was geïnstalleerd, zou u deze waarschuwing niet krijgen.

Moet ik kiezen tussen de 64-bits of 32-bits versie van MS Office en de 64-bits of 32-bits versie van SQL Server? Het verwijderen van de ene versie en het installeren van een andere is geen flexibele oplossing. Bovendien is het niet altijd mogelijk. Laten we eens kijken naar de vraag die iemand op MSDN heeft gesteld:

De MS Access-database is een productieomgeving op de site van de klant, en het is voor mij geen optie om deze te de-installeren en een 64-bits versie te installeren. Het is ook geen optie om de bestaande SQL Server 64 bit te deïnstalleren en natuurlijk de 32 bits versie te installeren. Een extra installatie van een SQL Server 32 bits, waarbij alleen de koppeling naar MS Access wordt gegeven, is dan de enige optie. Ik vind dit behoorlijk afschuwelijk.

Ik begrijp dit deel niet.

Aangezien er geen 64-bits Jet is, moet u de 64-bits versie van «Microsoft Access Database Engine 2010 Redistributable» downloaden en installeren. Bedankt voor je antwoord, maar als ik AccessDatabaseEngine_X64.exe installeer krijg ik de volgende foutmelding (foto 1) Raadpleeg dit KB-artikel: support.microsoft.com/kb/2269468 In het artikel in de link in uw laatste bericht staat dat u alle Office 32-bits producten moet de-installeren. Dat lijkt me niet logisch, want het doel is om verbinding te maken met de 32 bits MS Access-database… U moet de 64-bits versie van "Microsoft ACE OLEDB Provider" installeren om verbinding te maken met een Access-bestand (32-bits of 64-bits) van SQL Server. Maar ik heb geprobeerd het 64-bits stuurprogramma te installeren, maar ik krijg een installatiefout... Het vorige KB-artikel legt de oorzaak uit en geeft de oplossing, je kunt ernaar verwijzen. Je leidt me in cirkels.

Welnu, het probleem is om de 64-bits versie van Microsoft ACE OLEDB Provider te laten werken met de 32-bits Office. Waarom het niet mogelijk is om dit direct te doen, is een grote vraag. Er is veel informatie over dit onderwerp:

Het feit dat ze ons niet kunnen dwingen om twee verschillende versies van onze applicatie te compileren; één specifiek voor x86-platform en één voor x64-platform. Dan moeten we op de een of andere manier bepalen welke versie van het ACE-stuurprogramma is geïnstalleerd, zodat we weten welke versie (32 of 64 bit) van onze applicatie we moeten installeren. Het leven zou veel eenvoudiger zijn als we onze app gewoon konden compileren voor de standaard AnyCPU en dan mochten zowel 32 als 64 dataproviders worden geïnstalleerd... Waarom kunnen 32 en 64 bit ACE niet naast elkaar bestaan? Het is gebaseerd op het feit dat Microsoft de zij-aan-zij-installatie van 32- en 64-bits Microsoft Office 2010 of hun afhankelijke componenten niet ondersteunt... Het spijt me, maar dat is geen erg nuttig antwoord op de vraag. V:Waarom kunnen de 32- en 64-bits versies van Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe en AccessDatabaseEngine_X64.exe) niet beide op dezelfde computer worden geïnstalleerd? A:Microsoft ondersteunt de side-by-side installatie van 32- en 64-bits Microsoft Office 2010 niet. Dat is geen antwoord, dat is gewoon de vraag herhalen met andere woorden. V:Waarom kan ik dit niet doen? A:Omdat we het niet ondersteunen. Vraag:Waarom kunt u het niet ondersteunen? A:Omdat we het niet ondersteunen.

Als tijdelijke oplossing heb ik AccessDatabaseEngine_X64.exe gebruikt met de /passive-sleutel waarmee de 64-bits versie van de provider naast de 32-bits Office-versie kan bestaan. Opgemerkt moet worden dat Microsoft deze methode officieel niet ondersteunt. Daarnaast zijn er waarschuwingen over mogelijke problemen met de compatibiliteit.

Toen ik het stuurprogramma AccessDatabaseEngine_x64.exe installeerde ... MS Office Pro Plus start een MS-configuratieproces dat een minuut of twee kan duren voordat een document of Office-programma wordt geopend . Als Office 2010 32 bit is geïnstalleerd en als 64-bit ace is geïnstalleerd met /passive en vervolgens **elke** keer dat u Access 2010 uitvoert, krijgt u een automatische installatieroutine die wordt teruggezet naar de 32-bits stuurprogramma's voor kantoor .

In mijn geval (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1) waren er geen zichtbare problemen (klop op hout). Toch wil ik hieraan toevoegen dat het is zoals het is en zonder enige aansprakelijkheid.

Download AccessDatabaseEngine_x64.exe, maak een systeemherstelpunt (het lijkt automatisch te worden gemaakt bij het bijwerken van Office-componenten) en voer het uit vanaf de opdrachtregel. Dit zijn de mogelijke sleutels:

In tegenstelling tot afbeelding 2 wordt de installatie uitgevoerd

Klik vervolgens op Vernieuwen in het snelmenu Providers:

Ik heb heel snel een eenvoudig xslx-bestand gemaakt:

Maak in SQL Server een gekoppelde server op deze Excel:

if exists (select 1 from sys.servers where name = '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=Yes'

Script 1

Lees:

select * from openquery (XlsLnkSrv, 'Select * from [Sheet1$]')

Script 2

Is het succesvol? Nee!

Msg 7399, Level 16, State 1, Line 1
De OLE DB-provider «Microsoft.ACE.OLEDB.12.0» voor de gekoppelde server «XlsLnkSrv» rapporteerde een fout. De provider heeft geen informatie over de fout gegeven.
Msg 7303, Level 16, State 1, Line 1
Kan het gegevensbronobject van de OLE DB-provider «Microsoft.ACE.OLEDB.12.0» niet initialiseren voor gekoppelde server «XlsLnkSrv».

Toch is het gelukt!

Evenzo,

select * from openrowset('Microsoft.ACE.OLEDB.12.0',  
'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Select * from [Sheet1$]')

Eerst moeten we het volgende doen:

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

Script 3

Tot slot zou ik willen opmerken dat de 64-bits provider de 32-bits provider heeft vervangen. Als we een verbinding maken voor Sample.xslsx in Data Flow van het DTS-pakket, krijgen we een initialisatiefout van Microsoft Office 12.0 Access Database Engine OLE DB Provider, wat logisch correct is, aangezien devenv.exe 32-bit is, terwijl de provider is 64 bits. Om het gedrag te herstellen, is het noodzakelijk om de 32-bits Office-provider te herstellen (hier). In dit geval kunnen we de gekoppelde server echter niet gebruiken. Ga naar het begin van het artikel om de gekoppelde server te laten werken.


  1. Hoe DataFrame naar de postgres-tabel te schrijven?

  2. Milliseconde resolutie van DateTime in Ruby

  3. LINQ to Entities herkent de methode 'System.String ToString()' niet, en deze methode kan niet worden vertaald in een winkeluitdrukking

  4. Hoe maak je een alleen-lezen gebruiker aan in PostgreSQL?