Delen via


De ODBC-oplossing

De vraag is hoe ODBC databasetoegang standaardiseert? Er zijn twee architectuurvereisten:

  • Toepassingen moeten toegang hebben tot meerdere DBMS's met dezelfde broncode zonder opnieuw te compileren of opnieuw te koppelen.

  • Toepassingen moeten tegelijkertijd toegang hebben tot meerdere DBMS's.

En er is nog een vraag, vanwege marketplace-realiteit:

  • Welke DBMS-functies moeten ODBC beschikbaar maken? Alleen functies die gebruikelijk zijn voor alle DBMS's of functies die beschikbaar zijn in DBMS?

ODBC lost deze problemen op de volgende manier op:

  • ODBC is een interface op oproepniveau. OdBC definieert een standaard-CLI om het probleem op te lossen van hoe toepassingen toegang hebben tot meerdere DBMS's met dezelfde broncode. Dit bevat alle functies in de CLI-specificaties van Open Group en ISO/IEC en biedt aanvullende functies die vaak door toepassingen worden vereist.

    Er is een andere bibliotheek of stuurprogramma vereist voor elke DBMS die ODBC ondersteunt. Het stuurprogramma implementeert de functies in de ODBC-API. Als u een ander stuurprogramma wilt gebruiken, hoeft de toepassing niet opnieuw te worden gecompileerd of opnieuw gekoppeld. In plaats daarvan laadt de toepassing gewoon het nieuwe stuurprogramma en roept de functies erin aan. Voor gelijktijdige toegang tot meerdere DBMS's laadt de toepassing meerdere stuurprogramma's. Hoe stuurprogramma's worden ondersteund, is besturingssysteemspecifiek. Op het Microsoft Windows-besturingssysteem zijn stuurprogramma's bijvoorbeeld dynamic-linkbibliotheken (DLL's).

  • ODBC definieert een standaard-SQL-grammatica. Naast een standaardinterface op oproepniveau definieert ODBC een standaard-SQL-grammatica. Deze grammatica is gebaseerd op de OPEN GROUP SQL CAE-specificatie. Verschillen tussen de twee grammaticaën zijn secundair en voornamelijk vanwege de verschillen tussen de SQL-grammatica die is vereist voor ingesloten SQL (Open Group) en een CLI (ODBC). Er zijn ook enkele uitbreidingen voor de grammatica om veelgebruikte taalfuncties beschikbaar te maken die niet worden gedekt door de grammatica van de open groep.

    Toepassingen kunnen instructies indienen met behulp van ODBC- of DBMS-specifieke grammatica. Als een instructie GEBRUIKMAAKT van ODBC-grammatica die verschilt van DBMS-specifieke grammatica, converteert het stuurprogramma deze voordat het naar de gegevensbron wordt verzonden. Dergelijke conversies zijn echter zeldzaam omdat de meeste DBMS's al standaard SQL-grammatica gebruiken.

  • ODBC biedt Driver Manager om gelijktijdige toegang tot meerdere DBMS's te beheren. Hoewel het gebruik van stuurprogramma's het probleem van het gelijktijdig openen van meerdere DBMS's oplost, kan de code hiervoor complex zijn. Toepassingen die zijn ontworpen om met alle stuurprogramma's te werken, kunnen niet statisch worden gekoppeld aan stuurprogramma's. In plaats daarvan moeten ze stuurprogramma's laden tijdens runtime en de functies hierin aanroepen via een tabel met functie-aanwijzers. De situatie wordt complexer als de toepassing tegelijkertijd meerdere stuurprogramma's gebruikt.

    In plaats van dat elke toepassing dit afdwingt, biedt ODBC een Driver Manager. Driver Manager implementeert alle ODBC-functies , voornamelijk als passthrough-aanroepen naar ODBC-functies in stuurprogramma's - en is statisch gekoppeld aan de toepassing of geladen door de toepassing tijdens runtime. Daarom roept de toepassing ODBC-functies aan op naam in Driver Manager, in plaats van met de aanwijzer in elk stuurprogramma.

    Wanneer een toepassing een bepaald stuurprogramma nodig heeft, wordt eerst een verbindingsgreep aangevraagd waarmee het stuurprogramma kan worden geïdentificeerd en vervolgens wordt gevraagd of het stuurprogramma door Driver Manager wordt geladen. De Driver Manager laadt het stuurprogramma en slaat het adres van elke functie in het stuurprogramma op. Als u een ODBC-functie wilt aanroepen in het stuurprogramma, roept de toepassing die functie aan in Driver Manager en geeft de verbindingsgreep voor het stuurprogramma door. Driver Manager roept vervolgens de functie aan met behulp van het adres dat eerder is opgeslagen.

  • ODBC maakt een aanzienlijk aantal DBMS-functies beschikbaar, maar vereist geen stuurprogramma's om ze allemaal te ondersteunen. Als ODBC alleen functies beschikbaar heeft die gebruikelijk zijn voor alle DBMS's, zou het weinig worden gebruikt; Immers, de reden dat er tegenwoordig zoveel verschillende DBMS's bestaan, is dat ze verschillende functies hebben. Als ODBC elke functie beschikbaar heeft gesteld die beschikbaar is in DBMS, is het onmogelijk voor stuurprogramma's om te implementeren.

    In plaats daarvan maakt ODBC een aanzienlijk aantal functies beschikbaar, meer dan wordt ondersteund door de meeste DBMS's, maar vereist dat stuurprogramma's slechts een subset van deze functies implementeren. Stuurprogramma's implementeren alleen de resterende functies als ze worden ondersteund door de onderliggende DBMS of als ze ervoor kiezen om ze te emuleren. Toepassingen kunnen dus worden geschreven om gebruik te maken van de functies van één DBMS zoals weergegeven door het stuurprogramma voor dat DBMS, om alleen die functies te gebruiken die door alle DBMS's worden gebruikt, of om te controleren op ondersteuning van een bepaalde functie en dienovereenkomstig te reageren.

    Zodat een toepassing kan bepalen welke functies een stuurprogramma en DBMS-ondersteuning bieden, biedt ODBC twee functies (SQLGetInfo en SQLGetFunctions) die algemene informatie retourneren over de mogelijkheden van het stuurprogramma en DBMS en een lijst met functies die het stuurprogramma ondersteunt. ODBC definieert ook api- en SQL-grammaticaconformanceniveaus, die een breed scala aan functies opgeven die door het stuurprogramma worden ondersteund. Zie Nalevingsniveaus voor meer informatie.

    Het is belangrijk te onthouden dat ODBC een gemeenschappelijke interface definieert voor alle functies die worden weergegeven. Daarom bevatten toepassingen functiespecifieke code, niet DBMS-specifieke code en kunnen ze stuurprogramma's gebruiken die deze functies beschikbaar maken. Een voordeel hiervan is dat toepassingen niet hoeven te worden bijgewerkt wanneer de functies die worden ondersteund door een DBMS worden uitgebreid; In plaats daarvan, wanneer een bijgewerkt stuurprogramma is geïnstalleerd, gebruikt de toepassing automatisch de functies omdat de bijbehorende code functiespecifiek is, niet stuurprogrammaspecifiek of DBMS-specifiek.