Udostępnij przez


Długość danych, długość buforu i obcinanie

Długość danych jest długością bajtów danych, ponieważ będą przechowywane w buforze danych aplikacji, a nie tak, jak są przechowywane w źródle danych. To rozróżnienie jest ważne, ponieważ dane są często przechowywane w różnych typach w buforze danych niż w źródle danych. W przypadku danych wysyłanych do źródła danych jest to długość bajtów danych przed konwersją na typ źródła danych. W przypadku danych pobieranych ze źródła danych jest to długość danych w bajtach po konwersji na typ buforu danych i przed dokonaniem jakiegokolwiek obcięcia.

W przypadku danych o stałej długości, takich jak liczba całkowita lub struktura dat, długość bajtów danych jest zawsze rozmiarem typu danych. Ogólnie rzecz biorąc, aplikacje przydzielają bufor danych o rozmiarze typu danych. Jeśli aplikacja przydziela mniejszy bufor, konsekwencje są niezdefiniowane, ponieważ sterownik zakłada, że bufor danych jest rozmiarem typu danych i nie obcina danych w celu dopasowania ich do mniejszego buforu. Jeśli aplikacja przydziela większy bufor, dodatkowe miejsce nigdy nie jest używane.

W przypadku danych o zmiennej długości, takich jak dane znakowe lub binarne, należy pamiętać, że długość bajtów danych jest oddzielona i często różni się od długości bajtów buforu. Relacja tych dwóch długości jest opisana w sekcji Bufory. Jeśli długość bajtu danych jest większa niż długość bajtu buforu, sterownik obcina dane pobrane do długości bajtu buforu i zwraca SQL_SUCCESS_WITH_INFO z wartością SQLSTATE 01004 (Dane obcięte). Jednak zwracana długość w bajtach to długość nieobciętych danych.

Załóżmy na przykład, że aplikacja przydziela 50 bajtów dla binarnego buforu danych. Jeśli sterownik ma 10 bajtów danych binarnych do zwrócenia, zwraca te 10 bajtów w buforze. Długość bajtu danych wynosi 10, a długość bajtu buforu wynosi 50. Jeśli sterownik ma do zwrócenia 60 bajtów danych binarnych, przycina dane do 50 bajtów, zwraca te bajty w buforze i zwraca SQL_SUCCESS_WITH_INFO. Długość bajtu danych wynosi 60 (długość przed obcięciem), a długość bajtu buforu wynosi nadal 50.

Rekord diagnostyczny jest tworzony dla każdej kolumny, która jest obcięta. Ze względu na to, że utworzenie tych rekordów przez sterownik i przetworzenie ich przez aplikację zajmuje trochę czasu, trunkowanie może obniżyć wydajność. Zazwyczaj aplikacja może uniknąć tego problemu, przydzielając wystarczająco duże bufory, chociaż może to nie być możliwe w przypadku pracy z długimi danymi. W przypadku obcinania danych aplikacja może czasami przydzielić większy bufor i ponownie pobrać dane; nie jest to prawdą we wszystkich przypadkach. W przypadku ucięcia podczas pobierania danych z wywołaniami funkcji SQLGetData aplikacja nie musi ponownie wywoływać SQLGetData dla danych, które zostały już zwrócone; aby uzyskać więcej informacji, zobacz Getting Long Data (Uzyskiwanie długich danych).