Udostępnij przez


Dane znaków i ciągi języka C

Parametry wejściowe odwołujące się do danych znaków o zmiennej długości (takich jak nazwy kolumn, parametry dynamiczne i wartości atrybutów ciągu) mają skojarzony parametr długości. Jeśli aplikacja kończy ciągi znakiem null, jak to zwykle ma miejsce w języku C, podaje jako argument długość ciągu w bajtach (bez uwzględniania znaku null) lub SQL_NTS (Null-Terminated String). Argument o długości innej niż ujemna określa rzeczywistą długość skojarzonego ciągu. Argument długości może wynosić 0, aby określić ciąg o zerowej długości, który różni się od wartości NULL. Wartość ujemna SQL_NTS nakazuje sterownikowi określić długość ciągu, lokalizując znak zakończenia null.

Gdy dane znakowe są zwracane ze sterownika do aplikacji, sterownik musi zawsze je zakończyć znakiem null. Daje to aplikacji możliwość obsługi danych jako ciągu lub tablicy znaków. Jeśli bufor aplikacji nie jest wystarczająco duży, aby zwrócić wszystkie dane znaków, sterownik obcina je do długości buforu pomniejszonej o liczbę bajtów wymaganą przez znak zakończenia null, dołącza znak null do obciętych danych i zapisuje je w buforze. Aplikacje muszą zatem zawsze przydzielać dodatkowe miejsce na znak null na zakończenie w buforach używanych do pobierania danych znakowych. Na przykład do pobrania 50 znaków danych potrzebny jest bufor 51 bajtów.

Należy zachować szczególną ostrożność zarówno przez aplikację, jak i sterownik podczas wysyłania lub pobierania danych tekstowych o dużej długości w częściach za pomocą SQLPutData lub SQLGetData. Jeśli dane są przekazywane jako seria ciągów zakończonych znakami null, znaki te muszą zostać usunięte, zanim dane będą mogły zostać ponownie złożone.

Wielu programistów ODBC myli dane znakowe i ciągi języka C. To miało miejsce, jest artefaktem używania języka C podczas definiowania funkcji ODBC. Jeśli sterownik ODBC lub aplikacja używa innego języka — pamiętaj, że ODBC jest niezależny od języka — to zamieszanie jest mniej prawdopodobne.

Gdy ciągi języka C są używane do przechowywania danych znakowych, znak null nie jest traktowany jako część danych i nie jest liczony jako część długości w bajtach. Na przykład dane znaków "ABC" mogą być przechowywane jako ciąg C "ABC\0" lub tablica znaków {'A', 'B', 'C'}. Długość bajtu danych wynosi 3, niezależnie od tego, czy jest traktowana jako ciąg, czy tablica znaków.

Mimo że aplikacje i sterowniki często używają ciągów C (tablic zakończonych wartościami null) do przechowywania danych znakowych, nie jest to konieczne. W języku C dane typu znakowego mogą być również traktowane jako tablica znaków (bez zakończenia znaku null), a długość w bajtach przekazywana oddzielnie w buforze długości/wskaźnika.

Ponieważ dane znakowe mogą być przechowywane w tablicy bez zakończenia wartością null, a długość bajtów można przekazać osobno, możliwe jest osadzenie znaku null w danych znakowych. Jednak zachowanie funkcji ODBC w tym przypadku jest niezdefiniowane i jest specyficzne dla sterownika, czy sterownik obsługuje to poprawnie. W związku z tym międzyoperacyjne aplikacje powinny zawsze obsługiwać dane znaków, które mogą zawierać osadzone znaki null jako dane binarne.