sql >> Databasteknik >  >> RDS >> Access

Anslutningssträngsparametrar för Excel-datakällor

Anslutningssträngsparametrar för Excel-datakällor

I den tidigare artikeln diskuterade jag hur vi kan behandla Excel- och textfiler som om de vore en databas med DAO, och hur vi kan öppna dem utan att länka. Eftersom de inte använder ODBC-drivrutiner, kommer deras anslutningssträng att formateras helt annorlunda än vad du kanske är van vid att se för en ODBC-anslutningssträng. Det finns en brist på dokumentation om Excel-anslutningssträngsparametrarna. Detta är en bästa ansträngning för att täcka några av luckorna och diskutera konsekvenserna av parametrar.

Excel-anslutningssträngparametrar

Även om vi har 3 olika datakällor "typer":

  1. Excel 8.0 :97-2003 xls-filer
  2. Excel 12.0 :xlsb-filer
  3. Excel 12.0 Xml :xlsx-filer

De använder alla samma parametrar.

Här är listan över parametrar:

HDR parameter:Rubrikrad

YES :Den första raden är rubriken och ska bli kolumnnamnen för "tabellen"/"recordset"
NO :Den första raden behandlas inte annorlunda och är bara en data. Alla kolumnnamn kommer att heta "FN" där "N" är ett tal som börjar med 1

IMEX parameter:Import/Export Beteende

Detta styr hur kolumndatatyperna ska definieras, baserat på innehållet:
1 :Om kolumnen innehåller olika datatyper, behandla den som en sträng. Annars matchar du kolumnen med den bästa datatypen.
2 :Matcha alltid kolumnen med en viss datatyp baserat på provet. Det kan orsaka ett läsfel när vi läser en rad som innehåller data som inte matchar den förväntade datatypen.

ACCDB parameter:Indikerar att Access använder filformatet ACCDB?

Som standard är detta alltid inställt ACCDB=YES i ett accdb-filformat. Men att utelämna den eller ställa den till NO verkar inte göra någonting. Det är lite av ett mysterium. Om någon kan dela vilken effekt denna parameter har, skriv en kommentar så uppdaterar jag bloggen.

DATABAS:Sökväg till Excel-arbetsboken

Parametern bör innehålla en fullständigt kvalificerad sökväg, inklusive arbetsbokens namn.

Minsta fungerande anslutningssträng

Observera att DATABASE är den enda obligatoriska parametern utöver nyckelordet för datatypkällan. Därför kan en minsta fungerande anslutningssträng vara:

Excel 8.0;DATABASE=C:\Links\Products.xls

Ange ark eller område i anslutningssträngen

I det föregående exemplet såg du att ett ark representerade en "DAO.TableDef ". Kalkylblad är dock inte det enda som kan vara en "Tabledef ". Om Excel-kalkylarket innehåller ett namngivet område kommer det namngivna området att rapporteras som en "Tabledef " också. Dessutom kan vi "fråga" ett godtyckligt block i arket med hjälp av celladress. Till exempel:

Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx")
Set rs = db.OpenRecordsset("Sheet$1A1:A3")

Debug.Print rs.Name, rs.Fields.Count

Det är viktigt att notera att celladresserna inte kan överskrida arkets använda intervall. Till exempel, Products.xlsx har faktiskt bara innehåll i A1:B3, det betyder att om du öppnar en postuppsättning med Sheet1$A1:D5 får du fortfarande bara 2 för antal fält och 3 för posträkning. De extra tomma kolumnerna/raderna ignoreras helt enkelt. På baksidan, om du smutsade ner en cell någonstans utanför A1:B3 , arkets UsedRange kommer nu att bli lika större och frågan skulle då inkludera tomma kolumner och rader.

Därför är dessa giltiga namn att använda i en fråga på en Excel-databas:

  1. Sheet1$ – Hela det använda intervallet för ett kalkylblad.
  2. Sheet1$A1:B4 – Endast 2 kolumner och 3 rader (räknar ej rubrik), förutsatt att innehållet är ifyllt. Annars kan kolumner eller rader vara färre än begärt.
  3. ProductsRange – det namngivna området med det namnet.

Jag tycker att det är mycket trevligare att använda namngivna intervall där det är praktiskt eftersom detta säkerställer att du inte hårdkodar adresserna i din kod, särskilt om intervallet flyttas runt på grund av att användaren infogar nya kolumner eller rader men inte ändrar innehållet i det namngivna intervallet . Det är dock inte alltid praktiskt, särskilt om du tar emot kalkylblad från en tredje part och därför inte har någon kontroll över dess innehåll eller format. I det här fallet kan det också fungera att skriva en SQL-fråga.

Fråga Excel-datakälla

Anta att vi inte kan styra formatet och att vi inte vill förlita oss på absolut adress även om vi är övertygade om att vissa kolumner och rader faktiskt kommer att finnas. I den situationen är det bästa du kan göra att fråga. Här är ett exempel som bara väljer en rad:

  Dim db As DAO.Database
  Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx")

  Dim rs As DAO.Recordset
  Set rs = db.OpenRecordset("SELECT d.[Count] FROM [Sheet1$] AS d WHERE d.[Products] = 'Bananas';")
  Debug.Print rs.Fields(0).Value

Förhoppningsvis kan du se att detta är mycket lättare än att iterera över varje rad för att hitta vilken som har "bananer" och sedan läsa kolumnen till höger för att få räkningen. I det här fallet slår sökningen automatisering av Excel.

Slutsats

Du har sett att DAO gör det väldigt enkelt för oss att arbeta med Excel-datakälla och låtsas som om det var en relationsdatakälla och använda vårt favoritspråk och bekanta DAO-objekt istället för att skriva en massa VBA-kod som automatiserar Excel för att hitta data vi vill ha. Parametrarna för anslutningssträngen är ganska enkla och så länge du har sökvägen är du bra för att länka eller öppna ett Excel-kalkylblad.

I nästa artikel kommer vi att titta på anslutningsparametrar för textfil.


  1. Flytta en MariaDB-databas till krypterade och okrypterade tillstånd

  2. Hur man väljer från objekttypskolumnen i Oracle 11g?

  3. SQLite Tutorial:Allt du behöver veta

  4. Visa alltid decimaler i SQL?