Dela via


ODBC-lösningen

Frågan är alltså hur ODBC standardiserar databasåtkomst? Det finns två arkitekturkrav:

  • Program måste kunna komma åt flera DBMS med samma källkod utan att omkompilera eller länka om.

  • Program måste kunna komma åt flera DBMS samtidigt.

Och det finns ytterligare en fråga, på grund av marknadsplatsens verklighet:

  • Vilka DBMS-funktioner ska ODBC exponera? Är det bara funktioner som är gemensamma för alla DBMS eller någon funktion som är tillgänglig i någon DBMS?

ODBC löser dessa problem på följande sätt:

  • ODBC är ett gränssnitt på anropsnivå. För att lösa problemet med hur program får åtkomst till flera DBMS med samma källkod definierar ODBC ett standard-CLI. Detta innehåller alla funktioner i CLI-specifikationerna från Open Group och ISO/IEC och tillhandahåller ytterligare funktioner som ofta krävs av program.

    Ett annat bibliotek eller en annan drivrutin krävs för varje DBMS som stöder ODBC. Drivrutinen implementerar funktionerna i ODBC-API:et. Om du vill använda en annan drivrutin behöver programmet inte kompileras om eller länkas om. I stället läser programmet helt enkelt in den nya drivrutinen och anropar funktionerna i den. För att få åtkomst till flera DBMS samtidigt läser programmet in flera drivrutiner. Hur drivrutiner stöds är operativsystemspecifikt. På Microsoft Windows-operativsystemet är drivrutiner till exempel dynamiska länkbibliotek (DLL:er).

  • ODBC definierar en standard-SQL-grammatik. Förutom ett standardgränssnitt på anropsnivå definierar ODBC en SQL-standard grammatik. Den här grammatiken baseras på SQL CAE-specifikationen för öppen grupp. Skillnaderna mellan de två grammatikerna är mindre och beror främst på skillnaderna mellan SQL-grammatiken som krävs av inbäddad SQL (Öppen grupp) och en CLI (ODBC). Det finns också vissa utvidgningar av grammatiken för att visa vanliga språkfunktioner som inte omfattas av Open Group-grammatiken.

    Program kan skicka instruktioner med hjälp av ODBC- eller DBMS-specifik grammatik. Om en instruktion använder ODBC-grammatik som skiljer sig från DBMS-specifik grammatik konverterar drivrutinen den innan den skickas till datakällan. Sådana konverteringar är dock sällsynta eftersom de flesta DBMSs redan använder SQL-standardmatik.

  • ODBC tillhandahåller en Driver Manager för att hantera samtidig åtkomst till flera DBMS. Även om användningen av drivrutiner löser problemet med att komma åt flera DBMS samtidigt kan koden för att göra detta vara komplex. Program som är utformade för att fungera med alla drivrutiner kan inte statiskt kopplas till några drivrutiner. I stället måste de läsa in drivrutiner vid körning och anropa funktionerna i dem via en tabell med funktionspekare. Situationen blir mer komplex om programmet använder flera drivrutiner samtidigt.

    I stället för att tvinga varje program att göra detta tillhandahåller ODBC en Driver Manager. Driver Manager implementerar alla ODBC-funktioner – främst som direktanrop till ODBC-funktioner i drivrutiner – och är statiskt länkad till programmet eller läses in av programmet vid körning. Därför anropar programmet ODBC-funktioner efter namn i Driver Manager, i stället för med pekare i varje drivrutin.

    När ett program behöver en viss drivrutin begär det först en anslutningsreferens för att identifiera drivrutinen och begär sedan att Drivrutinen ska läsa in drivrutinen. Drivrutinshanteraren läser in drivrutinen och lagrar adressen för varje funktion i drivrutinen. För att anropa en ODBC-funktion i drivrutinen anropar programmet den funktionen i Drivrutinshanteraren och skickar anslutningshandtaget för drivrutinen. Drivrutinshanteraren anropar sedan funktionen med hjälp av den adress som den lagrade tidigare.

  • ODBC exponerar ett stort antal DBMS-funktioner men kräver inte drivrutiner för att stödja dem alla. Om ODBC endast exponerade funktioner som är gemensamma för alla DBMS skulle det vara till liten nytta. Anledningen till att så många olika DBMS finns idag är trots allt att de har olika funktioner. Om ODBC exponerade alla funktioner som är tillgängliga i någon DBMS skulle det vara omöjligt för drivrutiner att implementera.

    I stället exponerar ODBC ett stort antal funktioner – fler än de flesta DBMS: er – men kräver att drivrutiner endast implementerar en delmängd av dessa funktioner. Drivrutiner implementerar endast de återstående funktionerna om de stöds av underliggande DBMS eller om de väljer att emulera dem. Därför kan program skrivas för att utnyttja funktionerna i en enda DBMS som exponeras av drivrutinen för denna DBMS, för att endast använda de funktioner som används av alla DBMS eller för att söka efter stöd för en viss funktion och reagera därefter.

    Så att ett program kan avgöra vilka funktioner en drivrutin och DBMS-stöd har, tillhandahåller ODBC två funktioner (SQLGetInfo och SQLGetFunctions) som returnerar allmän information om drivrutins- och DBMS-funktionerna och en lista över funktioner som drivrutinen stöder. ODBC definierar också API- och SQL-grammatikefterlevnadsnivåer, som anger ett brett utbud av funktioner som stöds av drivrutinen. Mer information finns i Överensstämmelsenivåer.

    Det är viktigt att komma ihåg att ODBC definierar ett gemensamt gränssnitt för alla funktioner som den exponerar. På grund av detta innehåller program funktionsspecifik kod, inte DBMS-specifik kod, och kan använda alla drivrutiner som exponerar dessa funktioner. En fördel med detta är att program inte behöver uppdateras när funktionerna som stöds av en DBMS förbättras. När en uppdaterad drivrutin installeras använder programmet i stället funktionerna automatiskt eftersom koden är funktionsspecifik, inte drivrutinsspecifik eller DBMS-specifik.