SQLColAttribute – funkce
shoda
Zavedená verze: Dodržování standardů ODBC 3.0: ISO 92
souhrnu
sqlColAttribute vrátí informace popisovače sloupce v sadě výsledků. Informace popisovače se vrátí jako řetězec znaků, hodnota závislá na popisovači nebo celočíselná hodnota.
Poznámka
Další informace o tom, na co správce ovladačů mapuje tuto funkci, když rozhraní ODBC 3.x aplikace pracuje s rozhraním ODBC 2.x ovladač, viz mapování náhradních funkcí pro zpětnou kompatibilitu aplikací.
Syntax
SQLRETURN SQLColAttribute (
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier,
SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr,
SQLLEN * NumericAttributePtr);
Argumenty
StatementHandle
[Vstup] Popisovač příkazu
columnNumber
[Vstup] Číslo záznamu v IRD, ze kterého se má načíst hodnota pole. Tento argument odpovídá počtu výsledných dat seřazených postupně ve vzestupné pořadí sloupců počínaje číslem 1. Sloupce lze popsat v libovolném pořadí.
Sloupec 0 lze zadat v tomto argumentu, ale všechny hodnoty s výjimkou SQL_DESC_TYPE a SQL_DESC_OCTET_LENGTH vrátí nedefinované hodnoty.
[Vstup] Popisovač. Tento popisovač definuje, které pole v IRD by se mělo dotazovat (například SQL_COLUMN_TABLE_NAME).
CharacterAttributePtr
[Výstup] Ukazatel na vyrovnávací paměť, ve které chcete vrátit hodnotu v poli FieldIdentifier pole ColumnNumber řádku IRD, pokud je polem řetězec znaků. V opačném případě se pole nepoužívá.
Pokud CharacterAttributePtr má hodnotu NULL, StringLengthPtr vrátí celkový počet bajtů (s výjimkou znaku ukončení null pro data znaků), který se má vrátit do vyrovnávací paměti odkazované CharacterAttributePtr.
bufferLength
[Vstup] Pokud FieldIdentifier je pole definované rozhraním ODBC a CharacterAttributePtr odkazuje na řetězec znaku nebo binární vyrovnávací paměť, měl by být tento argument délkou *CharacterAttributePtr. Pokud FieldIdentifier je pole definované rozhraním ODBC a *CharacterAttributePtr je celé číslo, bude toto pole ignorováno. Pokud je *CharacterAttributePtr řetězec Unicode (při volání SQLColAttributeW), musí být argument BufferLength sudým číslem. Pokud FieldIdentifier je pole definované ovladačem, aplikace určuje povahu pole správci ovladačů nastavením BufferLength argumentu.
BufferLength může mít následující hodnoty:
Pokud CharacterAttributePtr je ukazatel na ukazatel, BufferLength by měl mít hodnotu SQL_IS_POINTER.
Pokud CharacterAttributePtr je ukazatel na řetězec znaku, BufferLength je délka vyrovnávací paměti.
Pokud CharacterAttributePtr je ukazatel na binární vyrovnávací paměť, aplikace umístí výsledek makra SQL_LEN_BINARY_ATTR(délka) do BufferLength. To umístí zápornou hodnotu v BufferLength.
Pokud je CharacterAttributePtr ukazatel na datový typ s pevnou délkou, BufferLeng th musí být jeden z následujících: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT nebo SQL_IS_USMALLINT.
StringLengthPtr
[Výstup] Ukazatel na vyrovnávací paměť, ve které se má vrátit celkový počet bajtů (s výjimkou bajtů ukončení null pro data znaků), které lze vrátit v *CharacterAttributePtr.
Pokud je počet bajtů dostupných pro vrácení větší nebo roven BufferLength, informace popisovače v *CharacterAttributePtr jsou zkráceny na BufferLength minus délka znaku ukončení null a je ukončena ovladačem.
U všech ostatních typů dat se hodnota BufferLength ignoruje a ovladač předpokládá velikost *CharacterAttributePtr je 32 bitů.
NumericAttributePtr
[Výstup] Ukazatel na celočíselnou vyrovnávací paměť, ve které se má vrátit hodnota v FieldIdentifier pole ColumnNumber řádku IRD, pokud je pole číselným popisovačem typu, například SQL_DESC_COLUMN_LENGTH. V opačném případě se pole nepoužívá. Upozorňujeme, že některé ovladače můžou zapisovat pouze nižší 32bitovou nebo 16bitovou verzi vyrovnávací paměti a ponechat bit s vyšším pořadím beze změny. Aplikace by proto před voláním této funkce měly inicializovat hodnotu na 0.
Návraty
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR nebo SQL_INVALID_HANDLE.
Diagnostika
Když sqlColAttribute vrátí SQL_ERROR nebo SQL_SUCCESS_WITH_INFO, může být přidružená hodnota SQLSTATE získána voláním SQLGetDiagRec s HandleType SQL_HANDLE_STMT a popisovačStatementHandle. Následující tabulka uvádí hodnoty SQLSTATE běžně vrácené SQLColAttribute a vysvětluje každý z nich v kontextu této funkce; notace "(DM)" předchází popisy funkcí SQLSTATEs vrácených správcem ovladačů. Návratový kód přidružený ke každé hodnotě SQLSTATE je SQL_ERROR, pokud není uvedeno jinak.
SQLSTATE | Chyba | Popis |
---|---|---|
01000 | Obecné upozornění | Informační zpráva specifická pro řidiče (Funkce vrátí SQL_SUCCESS_WITH_INFO.) |
01004 | Řetězcová data, zkrácená vpravo | Vyrovnávací paměť *CharacterAttributePtr nebyla dostatečně velká, aby vrátila celou hodnotu řetězce, takže hodnota řetězce byla zkrácena. Délka nerušené řetězcové hodnoty je vrácena v *StringLengthPtr. (Funkce vrátí SQL_SUCCESS_WITH_INFO.) |
07005 | Připravený příkaz není specifikace kurzoru | Příkaz přidružený k StatementHandle nevrátil sadu výsledků a FieldIdentifier nebyl SQL_DESC_COUNT. Nebyly k dispozici žádné sloupce, které by bylo potřeba popsat. |
07009 | Neplatný index popisovače | (DM) Hodnota zadaná pro ColumnNumber byla rovna 0 a atribut příkazu SQL_ATTR_USE_BOOKMARKS byl SQL_UB_OFF. Hodnota zadaná pro argument ColumnNumber byla větší než počet sloupců v sadě výsledků. |
HY000 | Obecná chyba | Došlo k chybě, pro kterou nebyla definována žádná specifická funkce SQLSTATE a pro kterou nebyla definována žádná implementace sqlSTATE. Chybová zpráva vrácená SQLGetDiagField ze struktury diagnostických dat popisuje chybu a její příčinu. |
HY001 | Chyba přidělení paměti | Ovladač nemohl přidělit paměť potřebnou k podpoře provádění nebo dokončení funkce. |
HY008 | Operace byla zrušena. | Asynchronní zpracování bylo povoleno pro StatementHandle. Funkce byla volána a před dokončením provádění byla volána Funkce byla volána a před dokončením provádění SQLCancel nebo SQLCancelHandle byla volána na StatementHandle z jiného vlákna v aplikaci s více vlákny. |
HY010 | Chyba posloupnosti funkcí | (DM) Byla volána asynchronně spouštěná funkce pro popisovač připojení, který je přidružen k StatementHandle. Tato asynchronní funkce se stále spouštěla, když byla volána funkce SQLColAttribute. (DM) (DM) Funkce byla volána před voláním SQLPrepare, SQLExecDirectnebo funkce katalogu pro StatementHandle. (DM) Pro (DM) |
HY013 | Chyba správy paměti | Volání funkce nelze zpracovat, protože základní objekty paměti nelze získat přístup, pravděpodobně kvůli nedostatku paměti. |
HY090 | Neplatná délka řetězce nebo vyrovnávací paměti | (DM) *CharacterAttributePtr je řetězec znaku a BufferLength byl menší než 0, ale ne rovno SQL_NTS. |
HY091 | Neplatný identifikátor pole popisovače | Hodnota zadaná pro argument FieldIdentifier nebyla jednou z definovaných hodnot a nebyla to hodnota definovaná implementací. |
HY117 | Připojení je pozastaveno kvůli neznámému stavu transakce. Jsou povoleny pouze funkce pro odpojení a jen pro čtení. | (DM) Další informace o pozastaveném stavu naleznete v tématu FUNKCE SQLEndTran. |
HYC00 | Ovladač není schopný | Hodnota zadaná pro argument FieldIdentifier ovladač nepodporuje. |
HYT01 | Vypršel časový limit připojení | Platnost časového limitu připojení vypršela, než zdroj dat odpověděl na žádost. Doba časového limitu připojení je nastavena prostřednictvím SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Ovladač tuto funkci nepodporuje. | (DM) Ovladač přidružený k StatementHandle funkci nepodporuje. |
IM017 | Dotazování je zakázané v asynchronním režimu oznámení. | Při každém použití modelu oznámení je dotazování zakázané. |
IM018 | sqlCompleteAsync nebyl volán k dokončení předchozí asynchronní operace na tomto popisovači. | Pokud předchozí volání funkce na popisovači vrátí SQL_STILL_EXECUTING a pokud je povolený režim oznámení, SQLCompleteAsync musí být volána v popisovači, aby bylo možné provést následné zpracování a dokončit operaci. |
Při volání po SQLPrepare a před SQLExecute, SQLColAttribute může vrátit libovolný SQLSTATE, který může vrátit SQLPrepare nebo SQLExecute, v závislosti na tom, kdy zdroj dat vyhodnotí příkaz SQL přidružený k StatementHandle.
Z důvodů výkonu by aplikace neměla před spuštěním příkazu volat SQLColAttribute.
Komentáře
Informace o tom, jak aplikace používají informace vrácené SQLColAttribute, naleznete v tématu metadat sady výsledků.
sqlColAttribute vrátí informace vNumericAttributePtr nebo v *CharacterAttributePtr. Celočíselné informace jsou vráceny v *NumericAttributePtr jako hodnota SQLLEN; všechny ostatní formáty informací jsou vráceny v *CharacterAttributePtr. Při vrácení informací v *NumericAttributePtr, ovladač ignoruje CharacterAttributePtr, BufferLengtha StringLengthPtr. Při vrácení informací v *CharacterAttributePtr, ovladač ignoruje NumericAttributePtr.
sqlColAttribute vrátí hodnoty z polí popisovače IRD. Funkce se volá pomocí popisovače příkazu místo popisovače. Hodnoty vrácené SQLColAttribute pro FieldIdentifier hodnoty uvedené dále v této části lze také načíst voláním SQLGetDescField s odpovídajícím popisovačem IRD.
Aktuálně definovaná pole popisovače, verze rozhraní ODBC, ve které byly zavedeny, a argumenty, ve kterých jsou pro ně vráceny informace, jsou uvedeny dále v této části; ovladače mohou definovat více typů popisovačů, aby mohly využívat různé zdroje dat.
ROZHRANÍ ODBC 3.x ovladač musí vrátit hodnotu pro každé pole popisovače. Pokud pole popisovače neplatí pro ovladač nebo zdroj dat a pokud není uvedeno jinak, ovladač vrátí hodnotu 0 v *StringLengthPtr nebo prázdný řetězec v *CharacterAttributePtr.
Zpětná kompatibilita
Rozhraní ODBC 3. funkce SQLColAttribute nahrazuje zastaralé rozhraní ODBC 2.funkce xSQLColAttributes. Při mapování SQLColAttributes na SQLColAttribute (když rozhraní ODBC 2.x aplikace pracuje s rozhraním ODBC 3.x ovladač) nebo mapování sqlColAttribute na sqlColAttributes (když rozhraní ODBC 3.x aplikace pracuje s ovladačem ODBC 2.x ovladač), správce ovladačů buď předá hodnotu FieldIdentifier, mapuje ji na novou hodnotu nebo vrací chybu následujícím způsobem:
Poznámka
Předpona použitá v
Pokud #define hodnotu ODBC 2.xFieldIdentifier je stejný jako #define hodnota ODBC 3.xFieldIdentifier, hodnota ve volání funkce je právě předána.
Hodnoty #define rozhraní ODBC 2.xFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION a SQL_COLUMN_SCALE se liší od #define hodnot ROZHRANÍ ODBC 3.xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE a SQL_DESC_LENGTH. ROZHRANÍ ODBC 2.x ovladač musí podporovat pouze rozhraní ODBC 2.x hodnot. ROZHRANÍ ODBC 3.x ovladač musí podporovat hodnoty "SQL_COLUMN" a "SQL_DESC" pro tyto tři FieldIdentifiers. Tyto hodnoty se liší, protože přesnost, měřítko a délka jsou definovány odlišně v rozhraní ODBC 3.x, než byly v rozhraní ODBC 2.x. Další informace naleznete v tématu Velikost sloupce, desetinné číslice, přenos délky oktů a velikost zobrazení.
Pokud #define hodnotu ODBC 2.xFieldIdentifier se liší od #define hodnoty ROZHRANÍ ODBC 3.xFieldIdentifier, jak se vyskytuje s hodnotami COUNT, NAME a NULLABLE, hodnota ve volání funkce se mapuje na odpovídající hodnotu. Například SQL_COLUMN_COUNT se mapuje na SQL_DESC_COUNT a SQL_DESC_COUNT se mapuje na SQL_COLUMN_COUNT v závislosti na směru mapování.
Pokud FieldIdentifier je nová hodnota v rozhraní ODBC 3.x, pro které nebyla v rozhraní ODBC 2 odpovídající hodnota.x, nebude mapován při rozhraní ODBC 3.x aplikace ji používá ve volání SQLColAttribute v rozhraní ODBC 2.x ovladač a volání vrátí SQLSTATE HY091 (neplatný identifikátor pole popisovače).
Následující tabulka uvádí typy popisovače vrácené SQLColAttribute. Typ NumericAttributePtr hodnot je SQLLEN *.
|
Informace vráceno v |
Popis |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, pokud je sloupec automatickým přírůstkem. SQL_FALSE, pokud sloupec není automatickým přírůstkem nebo není číselný. Toto pole je platné jenom pro sloupce číselného datového typu. Aplikace může vložit hodnoty do řádku obsahujícího sloupec automatického přírůstku, ale obvykle nemůže aktualizovat hodnoty ve sloupci. Při vložení do sloupce automatického přírůstku se do sloupce při vložení vloží jedinečná hodnota. Přírůstky nejsou definovány, ale jsou specifické pro zdroj dat. Aplikace by neměla předpokládat, že sloupec automatického přírůstku začíná v libovolném konkrétním bodě nebo přírůstcích podle jakékoli konkrétní hodnoty. |
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) | CharacterAttributePtr | Název základního sloupce pro sloupec sady výsledků. Pokud název základního sloupce neexistuje (jako v případě sloupců, které jsou výrazy), obsahuje tato proměnná prázdný řetězec. Tyto informace se vrátí z pole SQL_DESC_BASE_COLUMN_NAME záznamu VRD, což je pole jen pro čtení. |
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) | CharacterAttributePtr | Název základní tabulky, která obsahuje sloupec. Pokud nelze definovat název základní tabulky nebo není použitelný, obsahuje tato proměnná prázdný řetězec. Tyto informace se vrátí z pole SQL_DESC_BASE_TABLE_NAME záznamu VRD, což je pole jen pro čtení. |
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, pokud se sloupec považuje za malá a velká písmena pro kolace a porovnání. SQL_FALSE, pokud sloupec není považován za malá a velká písmena pro kolace a porovnání nebo je necharacter. |
SQL_DESC_CATALOG_NAME (ODBC 2.0) | CharacterAttributePtr | Katalog tabulky, která obsahuje sloupec. Vrácená hodnota je definována implementací, pokud je sloupec výrazem nebo je sloupec součástí zobrazení. Pokud zdroj dat nepodporuje katalogy nebo nelze určit název katalogu, vrátí se prázdný řetězec. Toto pole záznamu VARCHAR není omezeno na 128 znaků. |
SQL_DESC_CONCISE_TYPE (ODBC 1.0) | NumericAttributePtr | Stručný datový typ. Pro datové typy datetime a interval vrátí toto pole stručný datový typ; například SQL_TYPE_TIME nebo SQL_INTERVAL_YEAR. (Další informace najdete v tématu identifikátory a popisovače datových typů v dodatku D: Datové typy.) Tyto informace se vrátí z pole SQL_DESC_CONCISE_TYPE záznamu VRD. |
SQL_DESC_COUNT (ODBC 1.0) | NumericAttributePtr | Počet sloupců dostupných v sadě výsledků Vrátí hodnotu 0, pokud v sadě výsledků nejsou žádné sloupce. Hodnota v argumentu ColumnNumber je ignorována. Tyto informace se vrátí z pole hlavičky SQL_DESC_COUNT VRD. |
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) | NumericAttributePtr | Maximální počet znaků potřebných k zobrazení dat ze sloupce Další informace o velikosti zobrazení naleznete v tématu Velikost sloupce, Desetinná číslice, Přenést délku octetu a Velikost zobrazení v dodatku D: Datové typy. |
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, pokud má sloupec pevnou přesnost a nenulové měřítko, které jsou specifické pro zdroj dat. SQL_FALSE, pokud sloupec nemá pevnou přesnost a nenulové měřítko specifické pro zdroj dat. |
SQL_DESC_LABEL (ODBC 2.0) | CharacterAttributePtr | Popisek nebo název sloupce. Například sloupec s názvem EmpName může být označený jménem zaměstnance nebo může být označen aliasem. Pokud sloupec nemá popisek, vrátí se název sloupce. Pokud je sloupec neoznamenaný a nepojmenovaný, vrátí se prázdný řetězec. |
SQL_DESC_LENGTH (ODBC 3.0) | NumericAttributePtr | Číselná hodnota, která je maximální nebo skutečná délka znaku řetězce znaku nebo binárního datového typu. Jedná se o maximální délku znaku datového typu s pevnou délkou nebo skutečnou délku znaku datového typu s proměnnou délkou. Jeho hodnota vždy vylučuje bajt ukončení null, který končí řetězec znaku. Tyto informace se vrátí z pole SQL_DESC_LENGTH záznamu VRD. Další informace o délce najdete v tématu Velikost sloupce, desetinná čísla, přenos délky oktů a velikost zobrazení v dodatku D: Datové typy. |
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) | CharacterAttributePtr | Toto pole záznamu VARCHAR(128) obsahuje znak nebo znaky, které ovladač rozpozná jako předponu pro literál tohoto datového typu. Toto pole obsahuje prázdný řetězec pro datový typ, pro který není k dispozici předpona literálu. Další informace naleznete v tématu předpony literálů a přípon. |
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) | CharacterAttributePtr | Toto pole záznamu VARCHAR(128) obsahuje znak nebo znaky, které ovladač rozpozná jako příponu pro literál tohoto datového typu. Toto pole obsahuje prázdný řetězec pro datový typ, pro který není k dispozici přípona literálu. Další informace naleznete v tématu předpony literálů a přípon. |
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) | CharacterAttributePtr | Toto pole záznamu VARCHAR(128) obsahuje jakýkoli lokalizovaný (nativní jazyk) název datového typu, který se může lišit od běžného názvu datového typu. Pokud neexistuje žádný lokalizovaný název, vrátí se prázdný řetězec. Toto pole je určené jenom pro účely zobrazení. Znaková sada řetězce je závislá na národním prostředí a obvykle se jedná o výchozí znakovou sadu serveru. |
SQL_DESC_NAME (ODBC 3.0) | CharacterAttributePtr | Alias sloupce, pokud se použije. Pokud se alias sloupce nepoužije, vrátí se název sloupce. V obou případech je SQL_DESC_UNNAMED nastavená na SQL_NAMED. Pokud neexistuje název sloupce nebo alias sloupce, vrátí se prázdný řetězec a SQL_DESC_UNNAMED je nastavena na SQL_UNNAMED. Tyto informace se vrátí z pole SQL_DESC_NAME záznamu VRD. |
SQL_DESC_NULLABLE (ODBC 3.0) | NumericAttributePtr | SQL_ NULLABLE, pokud sloupec může mít hodnoty NULL; SQL_NO_NULLS, pokud sloupec neobsahuje hodnoty NULL; nebo SQL_NULLABLE_UNKNOWN, pokud není známo, zda sloupec přijímá hodnoty NULL. Tyto informace se vrátí z pole SQL_DESC_NULLABLE záznamu VRD. |
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) | NumericAttributePtr | Pokud je datový typ v poli SQL_DESC_TYPE přibližný číselný datový typ, obsahuje toto pole SQLINTEGER hodnotu 2, protože pole SQL_DESC_PRECISION obsahuje počet bitů. Pokud je datový typ v poli SQL_DESC_TYPE přesný číselný datový typ, obsahuje toto pole hodnotu 10, protože pole SQL_DESC_PRECISION obsahuje počet desetinných číslic. Toto pole je nastaveno na hodnotu 0 pro všechny nečíselné datové typy. |
SQL_DESC_OCTET_LENGTH (ODBC 3.0) | NumericAttributePtr | Délka znakového řetězce nebo binárního datového typu v bajtech. U znaků s pevnou délkou nebo binárních typů se jedná o skutečnou délku v bajtech. U znaků s proměnnou délkou nebo binárních typů se jedná o maximální délku v bajtech. Tato hodnota nezahrnuje ukončovací znak null. Tyto informace se vrátí z pole SQL_DESC_OCTET_LENGTH záznamu VRD. Další informace o délce najdete v tématu Velikost sloupce, desetinná čísla, přenos délky oktů a velikost zobrazení v dodatku D: Datové typy. |
SQL_DESC_PRECISION (ODBC 3.0) | NumericAttributePtr | Číselná hodnota, která pro číselný datový typ označuje platnou přesnost. U datových typů SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP a všech datových typů intervalů, které představují časový interval, je jeho hodnota použitelná přesnost komponenty zlomku sekund. Tyto informace se vrátí z pole SQL_DESC_PRECISION záznamu VRD. |
SQL_DESC_SCALE (ODBC 3.0) | NumericAttributePtr | Číselná hodnota, která se dá použít pro číselný datový typ. U datových typů DECIMAL a NUMERIC se jedná o definované měřítko. Není definován pro všechny ostatní datové typy. Tyto informace se vrátí z pole záznamu SCALE VRD. |
SQL_DESC_SCHEMA_NAME (ODBC 2.0) | CharacterAttributePtr | Schéma tabulky, která obsahuje sloupec Vrácená hodnota je definována implementací, pokud je sloupec výrazem nebo je sloupec součástí zobrazení. Pokud zdroj dat nepodporuje schémata nebo nelze určit název schématu, vrátí se prázdný řetězec. Toto pole záznamu VARCHAR není omezeno na 128 znaků. |
SQL_DESC_SEARCHABLE (ODBC 1.0) | NumericAttributePtr | SQL_PRED_NONE, pokud sloupec nelze použít v klauzuli WHERE. (To je stejné jako hodnota SQL_UNSEARCHABLE v rozhraní ODBC 2.x.) SQL_PRED_CHAR, pokud je možné sloupec použít v klauzuli WHERE, ale pouze s predikátem LIKE. (To je stejné jako hodnota SQL_LIKE_ONLY v rozhraní ODBC 2.x.) SQL_PRED_BASIC, pokud je možné sloupec použít v klauzuli WHERE se všemi relačními operátory s výjimkou like. (To je stejné jako hodnota SQL_EXCEPT_LIKE v rozhraní ODBC 2.x.) SQL_PRED_SEARCHABLE, pokud je možné sloupec použít v klauzuli WHERE s libovolným relačním operátorem. Sloupce typu SQL_LONGVARCHAR a SQL_LONGVARBINARY obvykle vrací SQL_PRED_CHAR. |
SQL_DESC_TABLE_NAME (ODBC 2.0) | CharacterAttributePtr | Název tabulky, která obsahuje sloupec. Vrácená hodnota je definována implementací, pokud je sloupec výrazem nebo je sloupec součástí zobrazení. Pokud název tabulky nelze určit, vrátí se prázdný řetězec. |
SQL_DESC_TYPE (ODBC 3.0) | NumericAttributePtr | Číselná hodnota, která určuje datový typ SQL. Pokud se columnNumber rovná 0, SQL_BINARY se vrátí pro záložky s proměnnou délkou a SQL_INTEGER se vrátí pro záložky s pevnou délkou. Pro datové typy datetime a interval vrátí toto pole podrobný datový typ: SQL_DATETIME nebo SQL_INTERVAL. (Další informace najdete v tématu identifikátory a popisovače datových typů v dodatku D: Datové typy. Tyto informace se vrátí z pole SQL_DESC_TYPE záznamu VRD. Poznámka: Chcete-li pracovat s rozhraním ODBC 2.ovladače x použijte místo toho SQL_DESC_CONCISE_TYPE. |
SQL_DESC_TYPE_NAME (ODBC 1.0) | CharacterAttributePtr | Název datového typu závislý na zdroji dat; Například "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" nebo "CHAR ( ) FOR BIT DATA". Pokud je typ neznámý, vrátí se prázdný řetězec. |
SQL_DESC_UNNAMED (ODBC 3.0) | NumericAttributePtr | SQL_NAMED nebo SQL_UNNAMED. Pokud SQL_DESC_NAME pole IRD obsahuje alias sloupce nebo název sloupce, vrátí se SQL_NAMED. Pokud neexistuje žádný název sloupce nebo alias sloupce, SQL_UNNAMED se vrátí. Tyto informace se vrátí z pole SQL_DESC_UNNAMED záznamu VRD. |
SQL_DESC_UNSIGNED (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, pokud je sloupec bez znaménka (nebo není číselný). SQL_FALSE, pokud je sloupec podepsaný. |
SQL_DESC_UPDATABLE (ODBC 1.0) | NumericAttributePtr | Sloupec je popsán hodnotami pro definované konstanty: SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN SQL_DESC_UPDATABLE popisuje aktualizovatelnost sloupce v sadě výsledků, nikoli sloupec v základní tabulce. Aktualizovatelnost základního sloupce, na kterém je založen sloupec sady výsledků, se může lišit od hodnoty v tomto poli. Zda je sloupec aktualizovatelný, může být založen na datovém typu, uživatelských oprávněních a definici samotné sady výsledků. Pokud není jasné, jestli je sloupec aktualizovatelný, SQL_ATTR_READWRITE_UNKNOWN by se měl vrátit. |
SQLColAttribute je rozšiřitelná alternativa k SQLDescribeCol. SQLDescribeCol vrátí pevnou sadu informací popisovače na základě ANSI-89 SQL. SQLColAttribute umožňuje přístup k rozsáhlejší sadě informací popisovače dostupných v rozšířeních dodavatelů ANSI SQL-92 a DBMS.
Související funkce
Informace o | Vidět |
---|---|
Vytvoření vazby vyrovnávací paměti ke sloupci v sadě výsledků | funkce SQLBindCol |
Zrušení zpracování příkazů | funkce SQLCancel |
Vrácení informací o sloupci v sadě výsledků | funkce SQLDescribeCol |
Načtení bloku dat nebo procházení sady výsledků | funkce SQLFetchScroll |
Načítání více řádků dat | funkce |
Příklad
Následující ukázkový kód neobsazuje bezplatné popisovače a připojení. Viz funkce SQLFreeHandle, ukázkový program ODBCa funkce SQLFreeStmt vzorové kódy pro bezplatné popisovače a příkazy.
// 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);
}
Viz také
Referenční
soubory hlaviček ODBC