SQLColAttribute, funkcja
zgodności
Wersja wprowadzona: Zgodność ze standardami ODBC 3.0: ISO 92
podsumowania
sqlColAttribute zwraca informacje deskryptora dla kolumny w zestawie wyników. Informacje deskryptora są zwracane jako ciąg znaków, wartość zależna od deskryptora lub wartość całkowita.
Nuta
Aby uzyskać więcej informacji na temat tego, co menedżer sterowników mapuje tę funkcję na czas ODBC 3. aplikacjax współpracuje z odBC 2.x sterownik, zobacz funkcje zastępowania mapowania w celu zapewnienia zgodności z poprzednimi wersjami aplikacji.
Składnia
SQLRETURN SQLColAttribute (
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier,
SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr,
SQLLEN * NumericAttributePtr);
Argumenty
, instrukcjaHandle
[Dane wejściowe] Uchwyt instrukcji.
ColumnNumber
[Dane wejściowe] Liczba rekordów w identyfikatorze IRD, z której ma zostać pobrana wartość pola. Ten argument odpowiada liczbie kolumn danych wyników uporządkowanej sekwencyjnie w kolejności rosnącej kolumny, począwszy od 1. Kolumny można opisać w dowolnej kolejności.
Kolumnę 0 można określić w tym argumencie, ale wszystkie wartości z wyjątkiem SQL_DESC_TYPE i SQL_DESC_OCTET_LENGTH będą zwracać niezdefiniowane wartości.
fieldidentifier
[Dane wejściowe] Uchwyt deskryptora. Ten uchwyt definiuje, które pole w identyfikatorze IRD powinno być odpytywane (na przykład SQL_COLUMN_TABLE_NAME).
CharacterAttributePtr
[Dane wyjściowe] Wskaźnik do buforu, w którym ma być zwracana wartość w polu FieldIdentifierColumnNumber wiersza identyfikatora IRD, jeśli pole jest ciągiem znaków. W przeciwnym razie pole jest nieużywane.
Jeśli CharacterAttributePtr ma wartość NULL, StringLengthPtr nadal zwróci całkowitą liczbę bajtów (z wyłączeniem znaku zakończenia wartości null dla danych znaków) dostępną do zwrócenia w buforze wskazywanym przez CharacterAttributePtr.
BufferLength
[Dane wejściowe] Jeśli FieldIdentifier jest polem zdefiniowanym przez odBC i CharacterAttributePtr wskazuje ciąg znaków lub bufor binarny, ten argument powinien być długością *CharacterAttributePtr. Jeśli FieldIdentifier jest polem zdefiniowanym przez odBC, a *atrybutu CharacterAttributePtr jest liczbą całkowitą, to pole jest ignorowane. Jeśli *CharacterAttributePtr jest ciągiem Unicode (podczas wywoływania sqlColAttributeW), argument BufferLength musi być liczbą parzystą. Jeśli FieldIdentifier jest polem zdefiniowanym przez sterownik, aplikacja wskazuje charakter pola menedżera sterowników, ustawiając argument BufferLength.
BufferLength mogą mieć następujące wartości:
Jeśli CharacterAttributePtr jest wskaźnikiem do wskaźnika, BufferLength powinna mieć wartość SQL_IS_POINTER.
Jeśli CharacterAttributePtr jest wskaźnikiem do ciągu znaków, BufferLength jest długością buforu.
Jeśli CharacterAttributePtr jest wskaźnikiem do buforu binarnego, aplikacja umieszcza wynik SQL_LEN_BINARY_ATTR(długości) makra w BufferLength. Spowoduje to umieszczenie wartości ujemnej w BufferLength.
Jeśli CharacterAttributePtr jest wskaźnikiem do typu danych o stałej długości, BufferLength musi być jednym z następujących elementów: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT lub SQL_IS_USMALLINT.
stringLengthPtr
[Dane wyjściowe] Wskaźnik do buforu, w którym ma zwrócić całkowitą liczbę bajtów (z wyłączeniem bajtu zakończenia wartości null dla danych znaków) dostępnych do zwrócenia w *CharacterAttributePtr.
W przypadku danych znaków, jeśli liczba dostępnych bajtów do zwrócenia jest większa lub równa BufferLength, deskryptor informacji w *CharacterAttributePtr jest obcięty do BufferLength minus długość znaku zakończenia wartości null i jest przerywany przez sterownik.
W przypadku wszystkich innych typów danych wartość BufferLength jest ignorowana, a sterownik przyjmuje rozmiar *CharacterAttributePtr wynosi 32 bity.
NumericAttributePtr
[Dane wyjściowe] Wskaźnik do buforu liczby całkowitej, w którym zwraca wartość w polu FieldIdentifier wiersza ColumnNumber wiersza IRD, jeśli pole jest typem deskryptora liczbowego, takim jak SQL_DESC_COLUMN_LENGTH. W przeciwnym razie pole jest nieużywane. Należy pamiętać, że niektóre sterowniki mogą zapisywać tylko niższe 32-bitowe lub 16-bitowe i pozostawić bit o wyższej kolejności bez zmian. W związku z tym aplikacje powinny zainicjować wartość 0 przed wywołaniem tej funkcji.
Zwraca
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR lub SQL_INVALID_HANDLE.
Diagnostyka
Gdy sqlColAttribute zwraca wartość SQL_ERROR lub SQL_SUCCESS_WITH_INFO, skojarzona wartość SQLSTATE może zostać uzyskana przez wywołanie SQLGetDiagRec z HandleType SQL_HANDLE_STMT i handle instrukcji Handle. W poniższej tabeli wymieniono wartości SQLSTATE, które są często zwracane przez SQLColAttribute i objaśniono poszczególne wartości w kontekście tej funkcji; notacja "(DM)" poprzedza opisy obiektów SQLSTATEs zwróconych przez menedżera sterowników. Kod zwracany skojarzony z każdą wartością SQLSTATE jest SQL_ERROR, chyba że określono inaczej.
SQLSTATE | Błąd | Opis |
---|---|---|
01000 | Ostrzeżenie ogólne | Komunikat informacyjny specyficzny dla sterownika. (Funkcja zwraca SQL_SUCCESS_WITH_INFO). |
01004 | Dane ciągów, prawe obcięte | Bufor *CharacterAttributePtr nie był wystarczająco duży, aby zwrócić całą wartość ciągu, więc wartość ciągu została obcięta. Długość nieprawdziwej wartości ciągu jest zwracana w *StringLengthPtr. (Funkcja zwraca SQL_SUCCESS_WITH_INFO). |
07005 | Przygotowana instrukcja nie jest specyfikacją kursora | Instrukcja skojarzona z instrukcją StatementHandle nie zwróciła zestawu wyników, a FieldIdentifier nie została SQL_DESC_COUNT. Nie było żadnych kolumn do opisania. |
07009 | Nieprawidłowy indeks deskryptora | (DM) Wartość określona dla ColumnNumber była równa 0, a atrybut instrukcji SQL_ATTR_USE_BOOKMARKS był SQL_UB_OFF. Wartość określona dla argumentu ColumnNumber była większa niż liczba kolumn w zestawie wyników. |
HY000 | Błąd ogólny | Wystąpił błąd, dla którego nie było określonego stanu SQLSTATE i dla którego nie zdefiniowano parametru SQLSTATE specyficznego dla implementacji. Komunikat o błędzie zwrócony przez SQLGetDiagField ze struktury danych diagnostycznych opisuje błąd i jego przyczynę. |
HY001 | Błąd alokacji pamięci | Sterownik nie może przydzielić pamięci wymaganej do obsługi wykonywania lub ukończenia funkcji. |
HY008 | Operacja anulowana | Przetwarzanie asynchroniczne zostało włączone dla instrukcji Handle. Wywołano funkcję , a przed zakończeniem wykonywania SQLCancel lub SQLCancelHandle została wywołana w StatementHandle. Następnie funkcja została ponownie wywołana w StatementHandle. Wywołano funkcję i przed jej ukończeniem SQLCancel lub SQLCancelHandle została wywołana w StatementHandle z innego wątku w aplikacji wielowątku. |
HY010 | Błąd sekwencji funkcji | (DM) Asynchronicznie wykonywana funkcja została wywołana dla dojścia połączenia skojarzonego z StatementHandle. Ta funkcja asynchroniczna była nadal wykonywana po wywołaniu atrybutu SQLColAttribute. (DM) SQLExecute, SQLExecDirectlub SQLMoreResults został wezwany do StatementHandle i zwrócił SQL_PARAM_DATA_AVAILABLE. Ta funkcja została wywołana przed pobraniem danych dla wszystkich parametrów przesyłanych strumieniowo. (DM) Funkcja została wywołana przed wywołaniem SQLPrepare, SQLExecDirectlub funkcji katalogu dla StatementHandle. (DM) Asynchronicznie wykonywana funkcja (a nie ta) została wywołana dla StatementHandle i nadal była wykonywana, gdy ta funkcja została wywołana. (DM) SQLExecute, SQLExecDirect, SQLBulkOperationslub SQLSetPos została wywołana dla StatementHandle i zwrócona SQL_NEED_DATA. Ta funkcja została wywołana przed wysłaniem danych dla wszystkich parametrów wykonywania danych lub kolumn. |
HY013 | Błąd zarządzania pamięcią | Nie można przetworzyć wywołania funkcji, ponieważ nie można uzyskać dostępu do bazowych obiektów pamięci, prawdopodobnie z powodu niskich warunków pamięci. |
HY090 | Nieprawidłowa długość ciągu lub buforu | (DM) *CharacterAttributePtr jest ciągiem znaków, a BufferLength był mniejszy niż 0, ale nie równy SQL_NTS. |
HY091 | Nieprawidłowy identyfikator pola deskryptora | Wartość określona dla argumentu FieldIdentifier nie była jedną ze zdefiniowanych wartości i nie była wartością zdefiniowaną przez implementację. |
HY117 | Połączenie jest zawieszone z powodu nieznanego stanu transakcji. Dozwolone są tylko funkcje rozłączania i tylko do odczytu. | (DM) Aby uzyskać więcej informacji na temat stanu wstrzymania, zobacz funkcja SQLEndTran. |
HYC00 | Sterownik nie jest w stanie | Wartość określona dla argumentu FieldIdentifier nie była obsługiwana przez sterownik. |
HYT01 | Upłynął limit czasu połączenia | Okres przekroczenia limitu czasu połączenia wygasł, zanim źródło danych odpowiedziało na żądanie. Limit czasu połączenia jest ustawiany za pomocą SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Sterownik nie obsługuje tej funkcji | (DM) Sterownik skojarzony z instrukcją Handle nie obsługuje funkcji. |
IM017 | Sondowanie jest wyłączone w trybie powiadomień asynchronicznych | Za każdym razem, gdy jest używany model powiadomień, sondowanie jest wyłączone. |
IM018 | sqlCompleteAsync nie została wywołana w celu ukończenia poprzedniej operacji asynchronicznej na tym dojściu. | Jeśli poprzednie wywołanie funkcji na dojściu zwraca SQL_STILL_EXECUTING i jeśli tryb powiadomień jest włączony, SQLCompleteAsync należy wywołać do dojścia, aby wykonać przetwarzanie końcowe i zakończyć operację. |
Po wywołaniu sqlPrepare i przed SQLExecuteSQLColAttribute może zwrócić dowolny element SQLSTATE, który może zostać zwrócony przez SQLPrepare lub SQLExecute, w zależności od tego, kiedy źródło danych ocenia instrukcję SQL skojarzona z instrukcją StatementHandle.
Ze względów wydajności aplikacja nie powinna wywoływać sqlColAttribute przed wykonaniem instrukcji.
Komentarze
Aby uzyskać informacje o sposobie używania informacji zwracanych przez SQLColAttribute, zobacz metadanych zestawu wyników.
sqlColAttribute zwraca informacje w *NumericAttributePtr lub w *CharacterAttributePtr. Informacje o liczbą całkowitą są zwracane w *LiczboweAttributePtr jako wartość SQLLEN; wszystkie inne formaty informacji są zwracane w *CharacterAttributePtr. Gdy informacje są zwracane w *NumericAttributePtr, sterownik ignoruje CharacterAttributePtr, BufferLengthi StringLengthPtr. Gdy informacje są zwracane w *CharacterAttributePtr, sterownik ignoruje NumericAttributePtr.
SQLColAttribute zwraca wartości z pól deskryptora IRD. Funkcja jest wywoływana za pomocą uchwytu instrukcji, a nie uchwytu deskryptora. Wartości zwracane przez
Obecnie zdefiniowane pola deskryptora, wersja ODBC, w której zostały wprowadzone, oraz argumenty, w których są zwracane informacje, są wyświetlane w dalszej części tej sekcji; Aby korzystać z różnych źródeł danych, można zdefiniować więcej typów deskryptorów przez sterowniki.
OdBC 3.x sterownik musi zwrócić wartość dla każdego pola deskryptora. Jeśli pole deskryptora nie ma zastosowania do sterownika lub źródła danych i chyba że określono inaczej, sterownik zwraca wartość 0 w *StringLengthPtr lub pusty ciąg w *CharacterAttributePtr.
Zgodność z poprzednimi wersjami
ODBC 3. funkcjaxSQLColAttribute zastępuje przestarzałą funkcję ODBC 2.x funkcji SQLColAttributes. Podczas mapowania
Nuta
Prefiks używany w FieldIdentifier wartości w odBC 3.x został zmieniony na używany w odBC 2.x. Nowy prefiks to "SQL_DESC"; stary prefiks to "SQL_COLUMN".
Jeśli wartość #define ODBC 2.xFieldIdentifier jest taka sama jak wartość #define ODBC 3.xFieldIdentifierwartość wywołania funkcji jest właśnie przekazywana.
Wartości #define ODBC 2.xFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION i SQL_COLUMN_SCALE różnią się od wartości #define ODBC 3.xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE i SQL_DESC_LENGTH. OdBC 2. sterownikx musi obsługiwać tylko sterownik ODBC 2.x wartości. OdBC 3.x sterownik musi obsługiwać wartości "SQL_COLUMN" i "SQL_DESC" dla tych trzech FieldIdentifiers. Te wartości różnią się, ponieważ precyzja, skala i długość są definiowane inaczej w odBC 3.x niż były w ODBC 2.x. Aby uzyskać więcej informacji, zobacz Rozmiar kolumny, Cyfry dziesiętne, Długość oktetu transferu i Rozmiar wyświetlania.
Jeśli wartość #define ODBC 2.xFieldIdentifier różni się od wartości #define ODBC 3.xFieldIdentifier, jak ma miejsce z wartościami COUNT, NAME i NULLABLE, wartość wywołania funkcji jest mapowana na odpowiednią wartość. Na przykład SQL_COLUMN_COUNT jest mapowany na SQL_DESC_COUNT, a SQL_DESC_COUNT jest mapowany na SQL_COLUMN_COUNT w zależności od kierunku mapowania.
Jeśli FieldIdentifier jest nową wartością w odBC 3.x, dla którego nie było odpowiedniej wartości w odBC 2.x, nie zostanie on zamapowany podczas odBC 3. aplikacjax używa jej w wywołaniu do SQLColAttribute w odBC 2.x sterownik, a wywołanie zwróci sqlSTATE HY091 (nieprawidłowy identyfikator pola deskryptora).
W poniższej tabeli wymieniono typy deskryptorów zwracane przez atrybutu SQLColAttribute. Typem wartości NumericAttributePtr jest SQLLEN *.
fieldidentifier |
Informacja zwrócone w |
Opis |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, jeśli kolumna jest kolumną autoinkrementacji. SQL_FALSE, jeśli kolumna nie jest kolumną autoinkrementacji lub nie jest liczbowa. To pole jest prawidłowe tylko dla kolumn typu danych liczbowych. Aplikacja może wstawić wartości do wiersza zawierającego kolumnę autoinkrementacji, ale zazwyczaj nie może aktualizować wartości w kolumnie. Po wprowadzeniu wstawiania do kolumny autoinkrementacji unikatowa wartość jest wstawiana do kolumny w czasie wstawiania. Przyrost nie jest zdefiniowany, ale jest specyficzny dla źródła danych. Aplikacja nie powinna zakładać, że kolumna autoinkrementacji rozpoczyna się w jakimkolwiek konkretnym punkcie lub zwiększa się o dowolną konkretną wartość. |
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) | CharacterAttributePtr | Nazwa kolumny podstawowej dla kolumny zestawu wyników. Jeśli nazwa kolumny podstawowej nie istnieje (tak jak w przypadku kolumn, które są wyrażeniami), ta zmienna zawiera pusty ciąg. Te informacje są zwracane z pola rekordu SQL_DESC_BASE_COLUMN_NAME IRD, które jest polem tylko do odczytu. |
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) | CharacterAttributePtr | Nazwa tabeli podstawowej zawierającej kolumnę. Jeśli nie można zdefiniować nazwy tabeli podstawowej lub nie ma zastosowania, ta zmienna zawiera pusty ciąg. Te informacje są zwracane z pola rekordu SQL_DESC_BASE_TABLE_NAME IRD, które jest polem tylko do odczytu. |
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, jeśli kolumna jest traktowana jako uwzględniana wielkość liter w przypadku sortowania i porównań. SQL_FALSE, jeśli kolumna nie jest traktowana jako wielkość liter w przypadku sortowania i porównań lub jest nietypowa. |
SQL_DESC_CATALOG_NAME (ODBC 2.0) | CharacterAttributePtr | Wykaz tabeli zawierającej kolumnę. Zwrócona wartość jest definiowana przez implementację, jeśli kolumna jest wyrażeniem lub jeśli kolumna jest częścią widoku. Jeśli źródło danych nie obsługuje wykazów lub nie można określić nazwy wykazu, zwracany jest pusty ciąg. To pole rekordu VARCHAR nie jest ograniczone do 128 znaków. |
SQL_DESC_CONCISE_TYPE (ODBC 1.0) | NumericAttributePtr | Zwięzły typ danych. W przypadku typów danych daty/godziny i interwału to pole zwraca zwięzły typ danych; na przykład SQL_TYPE_TIME lub SQL_INTERVAL_YEAR. (Aby uzyskać więcej informacji, zobacz Identyfikatory typów danych i deskryptory w dodatku D: Typy danych). Te informacje są zwracane z pola rekordu SQL_DESC_CONCISE_TYPE IRD. |
SQL_DESC_COUNT (ODBC 1.0) | NumericAttributePtr | Liczba kolumn dostępnych w zestawie wyników. Spowoduje to zwrócenie wartości 0, jeśli w zestawie wyników nie ma żadnych kolumn. Wartość argumentu ColumnNumber jest ignorowana. Te informacje są zwracane z pola nagłówka SQL_DESC_COUNT IRD. |
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) | NumericAttributePtr | Maksymalna liczba znaków wymaganych do wyświetlania danych z kolumny. Aby uzyskać więcej informacji na temat rozmiaru wyświetlania, zobacz Rozmiar kolumny, Cyfry dziesiętne, Długość oktetu transferu i Rozmiar wyświetlania w dodatku D: Typy danych. |
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, jeśli kolumna ma stałą precyzję i skalę niezerową, która jest specyficzna dla źródła danych. SQL_FALSE, jeśli kolumna nie ma stałej precyzji i skali niezerowej, które są specyficzne dla źródła danych. |
SQL_DESC_LABEL (ODBC 2.0) | CharacterAttributePtr | Etykieta kolumny lub tytuł. Na przykład kolumna o nazwie EmpName może być oznaczona etykietą Nazwa pracownika lub może być oznaczona aliasem. Jeśli kolumna nie ma etykiety, zwracana jest nazwa kolumny. Jeśli kolumna jest nieoznakowana i nienazwana, zwracany jest pusty ciąg. |
SQL_DESC_LENGTH (ODBC 3.0) | NumericAttributePtr | Wartość liczbowa, która jest maksymalną lub rzeczywistą długością znaku ciągu znaku lub typu danych binarnych. Jest to maksymalna długość znaku dla typu danych o stałej długości lub rzeczywista długość znaku dla typu danych o zmiennej długości. Jego wartość zawsze wyklucza bajt zakończenia null, który kończy ciąg znaków. Te informacje są zwracane z pola rekordu SQL_DESC_LENGTH IRD. Aby uzyskać więcej informacji na temat długości, zobacz Rozmiar kolumny, Cyfry dziesiętne, Długość oktetu transferu i Rozmiar wyświetlania w dodatku D: Typy danych. |
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) | CharacterAttributePtr | To pole rekordu VARCHAR(128) zawiera znak lub znaki, które sterownik rozpoznaje jako prefiks literału tego typu danych. To pole zawiera pusty ciąg dla typu danych, dla którego prefiks literału nie ma zastosowania. Aby uzyskać więcej informacji, zobacz Prefiksy literału i sufiksy. |
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) | CharacterAttributePtr | To pole rekordu VARCHAR(128) zawiera znak lub znaki, które sterownik rozpoznaje jako sufiks literału tego typu danych. To pole zawiera pusty ciąg dla typu danych, dla którego sufiks literału nie ma zastosowania. Aby uzyskać więcej informacji, zobacz Prefiksy literału i sufiksy. |
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) | CharacterAttributePtr | To pole rekordu VARCHAR(128) zawiera dowolną zlokalizowaną (natywną) nazwę typu danych, która może różnić się od zwykłej nazwy typu danych. Jeśli nie ma zlokalizowanej nazwy, zwracany jest pusty ciąg. To pole jest przeznaczone tylko do celów wyświetlania. Zestaw znaków ciągu jest zależny od ustawień regionalnych i zazwyczaj jest domyślnym zestawem znaków serwera. |
SQL_DESC_NAME (ODBC 3.0) | CharacterAttributePtr | Alias kolumny, jeśli ma zastosowanie. Jeśli alias kolumny nie ma zastosowania, zwracana jest nazwa kolumny. W obu przypadkach SQL_DESC_UNNAMED jest ustawiona na SQL_NAMED. Jeśli nie ma nazwy kolumny ani aliasu kolumny, zwracany jest pusty ciąg, a SQL_DESC_UNNAMED jest ustawiona na SQL_UNNAMED. Te informacje są zwracane z pola rekordu SQL_DESC_NAME IRD. |
SQL_DESC_NULLABLE (ODBC 3.0) | NumericAttributePtr | SQL_ dopuszczać wartość NULL, jeśli kolumna może mieć wartości NULL; SQL_NO_NULLS, jeśli kolumna nie ma wartości NULL; lub SQL_NULLABLE_UNKNOWN, jeśli nie wiadomo, czy kolumna akceptuje wartości NULL. Te informacje są zwracane z pola rekordu SQL_DESC_NULLABLE IRD. |
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) | NumericAttributePtr | Jeśli typ danych w polu SQL_DESC_TYPE jest przybliżonym typem danych liczbowych, to pole SQLINTEGER zawiera wartość 2, ponieważ pole SQL_DESC_PRECISION zawiera liczbę bitów. Jeśli typ danych w polu SQL_DESC_TYPE jest dokładnym typem danych liczbowych, to pole zawiera wartość 10, ponieważ pole SQL_DESC_PRECISION zawiera liczbę cyfr dziesiętnych. To pole ma wartość 0 dla wszystkich typów danych nieliczbowych. |
SQL_DESC_OCTET_LENGTH (ODBC 3.0) | NumericAttributePtr | Długość w bajtach ciągu znaków lub typu danych binarnych. W przypadku typów znaków o stałej długości lub binarnych jest to rzeczywista długość w bajtach. W przypadku typów znaków o zmiennej długości lub binarnych jest to maksymalna długość w bajtach. Ta wartość nie zawiera terminatora o wartości null. Te informacje są zwracane z pola rekordu SQL_DESC_OCTET_LENGTH IRD. Aby uzyskać więcej informacji na temat długości, zobacz Rozmiar kolumny, Cyfry dziesiętne, Długość oktetu transferu i Rozmiar wyświetlania w dodatku D: Typy danych. |
SQL_DESC_PRECISION (ODBC 3.0) | NumericAttributePtr | Wartość liczbowa, która dla typu danych liczbowych oznacza odpowiednią precyzję. W przypadku typów danych SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP i wszystkich typów danych interwałów reprezentujących przedział czasu, jego wartość jest odpowiednią dokładnością składnika ułamkowych sekund. Te informacje są zwracane z pola rekordu SQL_DESC_PRECISION IRD. |
SQL_DESC_SCALE (ODBC 3.0) | NumericAttributePtr | Wartość liczbowa, która jest odpowiednią skalą dla typu danych liczbowych. W przypadku typów danych DECIMAL i NUMERIC jest to zdefiniowana skala. Nie jest ona zdefiniowana dla wszystkich innych typów danych. Te informacje są zwracane z pola rekordu SCALE identyfikatora IRD. |
SQL_DESC_SCHEMA_NAME (ODBC 2.0) | CharacterAttributePtr | Schemat tabeli zawierającej kolumnę. Zwrócona wartość jest definiowana przez implementację, jeśli kolumna jest wyrażeniem lub jeśli kolumna jest częścią widoku. Jeśli źródło danych nie obsługuje schematów lub nie można określić nazwy schematu, zwracany jest pusty ciąg. To pole rekordu VARCHAR nie jest ograniczone do 128 znaków. |
SQL_DESC_SEARCHABLE (ODBC 1.0) | NumericAttributePtr | SQL_PRED_NONE, jeśli nie można użyć kolumny w klauzuli WHERE. (Jest to taka sama jak wartość SQL_UNSEARCHABLE w odBC 2.x.) SQL_PRED_CHAR, jeśli kolumna może być używana w klauzuli WHERE, ale tylko z predykatem LIKE. (Jest to taka sama jak wartość SQL_LIKE_ONLY w odBC 2.x.) SQL_PRED_BASIC, jeśli kolumna może być używana w klauzuli WHERE ze wszystkimi operatorami porównania z wyjątkiem LIKE. (Jest to taka sama jak wartość SQL_EXCEPT_LIKE w odBC 2.x.) SQL_PRED_SEARCHABLE, jeśli kolumna może być używana w klauzuli WHERE z dowolnym operatorem porównania. Kolumny typu SQL_LONGVARCHAR i SQL_LONGVARBINARY zwykle zwracają SQL_PRED_CHAR. |
SQL_DESC_TABLE_NAME (ODBC 2.0) | CharacterAttributePtr | Nazwa tabeli zawierającej kolumnę. Zwrócona wartość jest definiowana przez implementację, jeśli kolumna jest wyrażeniem lub jeśli kolumna jest częścią widoku. Jeśli nie można określić nazwy tabeli, zwracany jest pusty ciąg. |
SQL_DESC_TYPE (ODBC 3.0) | NumericAttributePtr | Wartość liczbowa określająca typ danych SQL. Gdy columnNumber jest równa 0, SQL_BINARY jest zwracana dla zakładek o zmiennej długości i SQL_INTEGER jest zwracana dla zakładek o stałej długości. W przypadku typów danych daty/godziny i interwału to pole zwraca pełny typ danych: SQL_DATETIME lub SQL_INTERVAL. (Aby uzyskać więcej informacji, zobacz Identyfikatory typów danych i deskryptory w dodatku D: Typy danych. Te informacje są zwracane z pola rekordu SQL_DESC_TYPE IRD. Uwaga: Aby pracować z odBC 2.sterowników x należy użyć SQL_DESC_CONCISE_TYPE. |
SQL_DESC_TYPE_NAME (ODBC 1.0) | CharacterAttributePtr | Nazwa typu danych zależnego od źródła danych; na przykład "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" lub "CHAR ( ) FOR BIT DATA". Jeśli typ jest nieznany, zwracany jest pusty ciąg. |
SQL_DESC_UNNAMED (ODBC 3.0) | NumericAttributePtr | SQL_NAMED lub SQL_UNNAMED. Jeśli pole SQL_DESC_NAME identyfikatora IRD zawiera alias kolumny lub nazwę kolumny, zostanie zwrócona SQL_NAMED. Jeśli nie ma nazwy kolumny ani aliasu kolumny, zostanie zwrócona SQL_UNNAMED. Te informacje są zwracane z pola rekordu SQL_DESC_UNNAMED IRD. |
SQL_DESC_UNSIGNED (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, jeśli kolumna jest niepodpisane (lub nie numeryczne). SQL_FALSE, jeśli kolumna jest podpisana. |
SQL_DESC_UPDATABLE (ODBC 1.0) | NumericAttributePtr | Kolumna jest opisana przez wartości zdefiniowanych stałych: SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN SQL_DESC_UPDATABLE opisuje aktualność kolumny w zestawie wyników, a nie kolumnę w tabeli bazowej. Skalowalność kolumny podstawowej, na której opiera się kolumna zestawu wyników, może różnić się od wartości w tym polu. To, czy kolumna jest aktualizowalna, może być oparta na typie danych, uprawnieniach użytkownika i definicji samego zestawu wyników. Jeśli nie jest jasne, czy kolumna jest aktualizowalna, należy zwrócić SQL_ATTR_READWRITE_UNKNOWN. |
SQLColAttribute to rozszerzalna alternatywa dla SQLDescribeCol. SQLDescribeCol zwraca stały zestaw informacji deskryptora na podstawie anSI-89 SQL. SQLColAttribute umożliwia dostęp do bardziej rozbudowanego zestawu informacji deskryptora dostępnych w rozszerzeniach dostawcy ANSI SQL-92 i DBMS.
Powiązane funkcje
Aby uzyskać informacje o | Widzieć |
---|---|
Wiązanie buforu z kolumną w zestawie wyników | funkcji SQLBindCol |
Anulowanie przetwarzania instrukcji | funkcji SQLCancel |
Zwracanie informacji o kolumnie w zestawie wyników | |
Pobieranie bloku danych lub przewijanie zestawu wyników | funkcji SQLFetchScroll |
Pobieranie wielu wierszy danych | funkcji SQLFetch |
Przykład
Poniższy przykładowy kod nie zwalnia obsługi i połączeń. Zobacz funkcji SQLFreeHandle , przykładowego programu ODBCi funkcji SQLFreeStmt, aby uzyskać przykłady kodu, aby zwolnić dojścia i instrukcje.
// SQLColAttibute.cpp
// compile with: user32.lib odbc32.lib
#define UNICODE
#include <windows.h>
#include <sqlext.h>
#include <strsafe.h>
struct DataBinding {
SQLSMALLINT TargetType;
SQLPOINTER TargetValuePtr;
SQLINTEGER BufferLength;
SQLLEN StrLen_or_Ind;
};
void printStatementResult(SQLHSTMT hstmt) {
int bufferSize = 1024, i;
SQLRETURN retCode;
SQLSMALLINT numColumn = 0, bufferLenUsed;
retCode = SQLNumResultCols(hstmt, &numColumn);
SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );
struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );
printf( "Columns from that table:\n" );
for ( i = 0 ; i < numColumn ; i++ ) {
columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );
retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);
wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );
}
// allocate memory for the binding
for ( i = 0 ; i < numColumn ; i++ ) {
columnData[i].TargetType = SQL_C_CHAR;
columnData[i].BufferLength = (bufferSize+1);
columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );
}
// setup the binding
for ( i = 0 ; i < numColumn ; i++ ) {
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,
columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));
}
printf( "Data from that table:\n" );
// fetch the data and print out the data
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {
int j;
for ( j = 0 ; j < numColumn ; j++ )
wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );
printf( "\n" );
}
printf( "\n" );
}
int main() {
int bufferSize = 1024, i, count = 1, numCols = 5;
wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );
HWND desktopHandle = GetDesktopWindow(); // desktop's window handle
SQLWCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen, bufferLen;
SQLRETURN retCode;
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );
SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );
// connect to database
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);
retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// display the database information
retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);
retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);
for ( i = 0 ; i < numCols ; i++ ) {
catalogResult[i].TargetType = SQL_C_CHAR;
catalogResult[i].BufferLength = (bufferSize + 1);
catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );
}
// Set up the binding. This can be used even if the statement is closed by closeStatementHandle
for ( i = 0 ; i < numCols ; i++ )
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));
retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )
if ( count == 1 )
StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
wprintf( L"Select all data from the first table (%s)\n", firstTableName );
StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );
retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);
printStatementResult(hstmt);
}
Zobacz też
dokumentacja interfejsu API ODBC
plików nagłówków ODBC
przykładowego programu ODBC