Delen via


Tekengegevens en C-tekenreeksen

Invoerparameters die verwijzen naar tekengegevens met variabele lengte (zoals kolomnamen, dynamische parameters en tekenreekskenmerkwaarden) hebben een bijbehorende lengteparameter. Als de applicatie tekenreeksen beëindigt met het nullteken, zoals gebruikelijk is in C, geeft het als argument ofwel de lengte in bytes van de tekenreeks (exclusief de null-terminator) of SQL_NTS (Null-Terminated String). Een niet-negatief lengteargument geeft de werkelijke lengte van de bijbehorende tekenreeks aan. Het lengteargument kan 0 zijn om een tekenreeks met lengte nul op te geven, die verschilt van een NULL-waarde. De negatieve waarde SQL_NTS stuurt het stuurprogramma om de lengte van de tekenreeks te bepalen door het nul-teken te zoeken.

Wanneer tekengegevens van het stuurprogramma naar de toepassing worden geretourneerd, moet het stuurprogramma deze altijd afsluiten met een null-waarde. Dit geeft de toepassing de keuze of de gegevens moeten worden verwerkt als een tekenreeks of een tekenmatrix. Als de toepassingsbuffer niet groot genoeg is om alle tekengegevens terug te geven, kapt het stuurprogramma deze af tot de lengte van de buffer min het aantal bytes dat nodig is voor het nul-afsluitingsteken, beëindigt het de afgekorte gegevens met nul en slaat het deze op in de buffer. Daarom moeten toepassingen altijd extra ruimte toewijzen voor het null-beëindigingsteken in buffers die worden gebruikt om tekengegevens op te halen. Er is bijvoorbeeld een buffer van 51 byte nodig om 50 tekens aan gegevens op te halen.

Bij het verzenden of ophalen van lange tekenreeksgegevens in delen met SQLPutData of SQLGetData moeten zowel de toepassing als het stuurprogramma zorgvuldig zijn. Als de gegevens worden doorgegeven als een reeks null-beëindigde tekenreeksen, moeten de null-beëindigingstekens op deze tekenreeksen worden verwijderd voordat de gegevens opnieuw kunnen worden samengesteld.

Een aantal ODBC-programmeurs hebben tekengegevens en C-tekenreeksen verward. Dit is een artefact van het gebruik van de C-taal bij het definiëren van ODBC-functies. Als een ODBC-stuurprogramma of -toepassing een andere taal gebruikt, moet u er rekening mee houden dat ODBC taalonafhankelijk is, waardoor verwarring minder snel zal ontstaan.

Wanneer C-tekenreeksen worden gebruikt voor het opslaan van tekengegevens, wordt het teken null-beëindiging niet beschouwd als onderdeel van de gegevens en wordt het niet meegeteld als onderdeel van de bytelengte. De tekengegevens 'ABC' kunnen bijvoorbeeld worden opgeslagen als de C-tekenreeks 'ABC\0' of de tekenmatrix {'A', 'B', 'C'}. De bytelengte van de gegevens is 3, ongeacht of deze worden behandeld als een tekenreeks of een tekenmatrix.

Hoewel toepassingen en stuurprogramma's vaak C-tekenreeksen (null-beëindigde matrices van tekens) gebruiken om tekengegevens te bewaren, hoeft u dit niet te doen. In C kunnen tekengegevens ook worden behandeld als een matrix van tekens (zonder null-beëindiging) en de bytelengte afzonderlijk doorgegeven in de lengte/indicatorbuffer.

Omdat tekengegevens kunnen worden opgeslagen in een array die niet op null eindigt en de bytelengte afzonderlijk kan worden doorgegeven, is het mogelijk null-tekens op te nemen in tekengegevens. Het gedrag van ODBC-functies in dit geval is echter niet gedefinieerd en het is stuurprogrammaspecifiek of een stuurprogramma dit correct verwerkt. Interoperabele toepassingen moeten dus altijd tekengegevens verwerken die ingesloten null-tekens kunnen bevatten als binaire gegevens.