sql >> Databasteknik >  >> RDS >> Sqlserver

32-bitars Excel och 64-bitars SQL Server

Vad kan vara enklare än att hämta data från en Excel-tabell i SQL Server?

Det finns många sätt att utföra denna uppgift. Du kan använda Integrationstjänster (tidigare DTS) eller importera och exportera wizard, vilket är samma under huven. Ett annat sätt är att skapa en enkel ADO.NET-app . Du kan använda den länkade servern mekanism, som låter dig se alla ODBC / OLE DB-nåbara objekt i form av en tabell (en samling tabeller) eller resultatet av en ad hoc-fråga.

Det hade varit tills 64-bitarsarkitekturen slutade vara något från hi-end-klassen och kom till utvecklarna och användarnas bärbara datorer. En typisk användare är osannolikt att installera en databasserver, medan det är normalt för en utvecklare att ha en 64-bitars SQL Server på en 64-bitars maskin med 32-bitars MS Office. Men i det här fallet kan det vara en utmaning att använda Excel eller Access med länkade SQL Server-servrar eftersom drivrutiner är 32-bitars. Det finns inga tillgängliga leverantörer för MS Office, även om jag har en installerad på min PC.

Således kommer ett försök att använda Excel eller Access med SQL Server-länkade servrar, som beskrivs i dokumentationen, att orsaka följande fel:

Msg 7302, Level 16, State 1, Line 1

Kan inte skapa en instans av OLE DB-leverantören «Microsoft.ACE.OLEDB.12.0» för länkad server...

Så, vad ska man göra?

Installera 64-bitars leverantör, som är tillgänglig för nedladdning på Microsoft Access Database Engine 2010 Redistributable. Vi får följande fel under installationsprocessen:

Om 32-bitars Office inte var installerat på datorn skulle du inte få den här varningen.

Ska jag välja mellan 64-bitars eller 32-bitarsversionen av MS Office och 64-bitars eller 32-bitarsversionen av SQL Server? Att avinstallera en version och installera en annan är ingen flexibel lösning. Dessutom är det inte alltid möjligt. Låt oss ta en titt på frågan en person har tagit upp på MSDN:

MS Access-databasen är en produktionsmiljö på kundens plats, och det är inte ett alternativ för mig att avinstallera den och installera en 64-bitarsversion. Det är inte heller ett alternativ att avinstallera den befintliga SQL Server 64-bitars och installera 32-bitarsversionen, naturligtvis. En ytterligare installation av en SQL Server 32 bitar, att endast tillhandahålla länken till MS Access skulle vara det enda alternativet då. Jag tycker det här är ganska hemskt.

Jag förstår inte den här delen.

Eftersom det inte finns någon 64-bitars Jet behöver du ladda ner och installera 64-bitarsversionen av «Microsoft Access Database Engine 2010 Redistributable». Tack för ditt svar, men när jag installerar AccessDatabaseEngine_X64.exe får jag följande felmeddelande (bild 1) Se denna KB-artikel: support.microsoft.com/kb/2269468 Artikeln i länken i ditt senaste meddelande säger att alla Office 32-bitarsprodukter ska avinstalleras. Det är ingen mening för mig, eftersom målet är att ansluta till 32-bitars MS Access-databasen... Du måste installera 64-bitarsversionen av "Microsoft ACE OLEDB Provider" för att ansluta till en Access-fil (32-bitars eller 64-bitars) från SQL Server. Men jag försökte installera 64-bitars drivrutinen, men det ger mig ett installationsfel... Den tidigare KB-artikeln förklarar orsaken och tillhandahåller lösningen, du kan hänvisa till den. Du guidar mig i cirklar.

Tja, problemet är att få 64-bitarsversionen av Microsoft ACE OLEDB Provider att fungera med 32-bitars Office. Varför det inte går att göra detta direkt är en stor fråga. Det finns mycket information om detta ämne:

Det faktum att de inte kan tvinga oss att kompilera två olika versioner av vår applikation; en specifikt för x86-plattformen och en för x64-plattformen. Sedan måste vi på något sätt bestämma vilken version av ACE-drivrutinen som är installerad så att vi vet vilken version (32 eller 64 bitar) av vår applikation som ska installeras. Livet skulle vara mycket enklare om vi bara kunde kompilera vår app för standard AnyCPU och sedan fick både 32 och 64 dataleverantörer installeras... Varför kan inte 32 och 64 bitars ACE samexistera? Det är baserat på det faktum att Microsoft inte stöder sida vid sida-installation av 32 och 64-bitars Microsoft Office 2010 eller deras beroende komponenter... Jag är ledsen, men det är inte ett särskilt användbart svar på frågan. F:Varför kan inte 32- och 64-bitarsversionerna av Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe och AccessDatabaseEngine_X64.exe) båda installeras på samma maskin? S:Microsoft stöder inte installationen sida vid sida av 32 och 64-bitars Microsoft Office 2010. Det svarar inte, det är bara att upprepa frågan med andra ord. F:Varför kan jag inte göra detta? S:För att vi inte stöder det. F:Varför kan du inte stödja det? S:Eftersom vi inte stöder det.

Som en lösning använde jag AccessDatabaseEngine_X64.exe med /passive-nyckeln som tillåter 64-bitarsversionen av leverantören samexistera med 32-bitars Office-versionen. Det bör noteras att Microsoft inte stöder denna metod officiellt. Dessutom finns det varningar om möjliga problem med kompatibiliteten.

När jag installerade drivrutinen AccessDatabaseEngine_x64.exe ... MS Office Pro Plus startar en MS-konfigurationsprocess som kan ta upp till en minut eller två innan ett dokument eller Office-program öppnas . Om office 2010 32-bitars är installerat och om 64-bitars ace är installerat med /passiv , sedan **varje** gång du kör Access 2010 får du en automatisk installationsrutin som återställs till 32-bitars drivrutiner för office .

I mitt fall (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1) fanns det inga synliga problem (knacka på trä). Ändå skulle jag vilja tillägga att det är som det är och utan några skulder.

Ladda ner AccessDatabaseEngine_x64.exe, skapa systemåterställningspunkt (den verkar skapas automatiskt när du uppdaterar Office-komponenter) och kör från kommandoraden. Här är de möjliga nycklarna:

Till skillnad från bild 2 körs installationen

Klicka sedan på Uppdatera på snabbmenyn för leverantörer:

Jag skapade en enkel xslx-fil mycket snabbt:

I SQL Server, skapa en länkad server på denna Excel:

om existerar (välj 1 från sys.servers där namn ='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älj * från openquery (XlsLnkSrv, 'Välj * från [Sheet1$]')

Script 2

Är det framgångsrikt? Nej!

Msg 7399, Level 16, State 1, Line 1
OLE DB-leverantören «Microsoft.ACE.OLEDB.12.0» för länkad server «XlsLnkSrv» rapporterade ett fel. Leverantören gav ingen information om felet.
Msg 7303, Level 16, State 1, Line 1
Det går inte att initiera datakällans objekt för OLE DB-leverantören «Microsoft.ACE.OLEDB.12.0» för länkad server «XlsLnkSrv».

Ändå är det lyckat!

Likaså

välj * från openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Ja', 'Välj * från [Sheet1$]') 

Till en början måste vi göra följande:

exec sp_configure 'visa avancerade alternativ', 1;reconfigure;exec sp_configure 'Ad Hoc Distributed Queries', 1;reconfigure

Script 3

Sammanfattningsvis skulle jag vilja notera att 64-bitarsleverantören ersatte 32-bitarsleverantören. Om vi ​​skapar en anslutning för Sample.xslsx i Data Flow i DTS-paketet kommer vi att få ett initialiseringsfel av Microsoft Office 12.0 Access Database Engine OLE DB Provider, vilket är logiskt korrekt, eftersom devenv.exe är 32-bitars, medan leverantören är 64-bitars. För att återställa beteendet är det nödvändigt att återställa 32-bitars Office-leverantören (här). Men i det här fallet kan vi inte använda den länkade servern. För att få den länkade servern att fungera, gå till början av artikeln.


  1. SQL Server-säkerhetskopiering/återställning kontra ta bort/fästa

  2. Handledning för SQL Server-tabellpartitionering och partitioner

  3. Ge MySQL-tabell- och kolumnbehörigheter

  4. Introducerar ny funktion - Spotlight Cloud Reports