Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Soulad
Představená verze: ODBC 1.0 Soulad standardů: Open Group
Shrnutí
SQLTables vrací seznam názvů tabulek, katalogů nebo schémat a typů tabulek, uložených v konkrétním datovém zdroji. Ovladač vrátí informace jako sadu výsledků.
Syntax
SQLRETURN SQLTables(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLCHAR * TableType,
SQLSMALLINT NameLength4);
Arguments
StatementHandle
[Vstup] Handle příkazu pro získané výsledky.
CatalogName
[Vstup] Název katalogu. Argument CatalogName přijímá vyhledávací vzory, pokud je atribut SQL_ODBC_VERSION environment SQL_OV_ODBC3; nepřijímá vyhledávací vzory, pokud je SQL_OV_ODBC2 nastaveno. Pokud ovladač podporuje katalogy pro některé tabulky, ale ne pro jiné, například když ovladač získává data z různých DBMS, prázdný řetězec ("") označuje ty tabulky, které katalogy nemají.
Pokud je atribut SQL_ATTR_METADATA_ID příkazu nastaven na SQL_TRUE, CatalogName je považován za identifikátor a jeho případ není významný. Pokud je to SQL_FALSE, CatalogName je argument vzorové hodnoty; Je brána doslovně a její případ je významný. Další informace naleznete v tématu Argumenty funkce katalogu.
NameLength1
[Vstup] Délka znaků *CatalogName.
Název schématu
[Vstup] Vzor vyhledávání řetězců pro názvy schémat. Pokud ovladač podporuje schémata pro některé tabulky, ale ne pro jiné, například když ovladač získává data z různých DBMS, prázdný řetězec ("") označuje ty tabulky, které schémata nemají.
Pokud je atribut SQL_ATTR_METADATA_ID příkazu nastaven na SQL_TRUE, SchemaName je považován za identifikátor a jeho případ není významný. Pokud je to SQL_FALSE, SchemaName je argument hodnoty vzoru; Je brána doslovně a její případ je významný.
NameLength2
[Vstup] Délka znaků *SchemaName.
TableName
[Vstup] Vzor vyhledávání řetězců pro názvy tabulek.
Pokud je atribut SQL_ATTR_METADATA_ID příkazu nastaven na SQL_TRUE, TableName je považován za identifikátor a jeho případ není významný. Pokud je SQL_FALSE, TableName je argument vzorové hodnoty; Je brána doslovně a její případ je významný.
NameLength3
[Vstup] Délka znaků *TableName.
Typ tabulky
[Vstup] Seznam typů tabulek, které je třeba shodovat.
Všimněte si, že atribut SQL_ATTR_METADATA_ID příkazu nemá žádný vliv na argument TableType . TableType je argument se seznamem hodnot, bez ohledu na nastavení SQL_ATTR_METADATA_ID.
NameLength4
[Vstup] Délka ve znacích *TableType.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR nebo SQL_INVALID_HANDLE.
Diagnostics
Když SQLTables vrátí SQL_ERROR nebo SQL_SUCCESS_WITH_INFO, lze získat přidruženou hodnotu SQLstate, kterou lze získat voláním SQLGetDiagRec pomocí HandleType SQL_HANDLE_STMT a HandleStatementHandle. Následující tabulka uvádí hodnoty SQLSTATE, které SQLTables obvykle vrací, a vysvětluje každou z nich v kontextu této funkce; notace "(DM)" předchází popisům SQLstavů vráceným Správcem ovladačů. Návratový kód přidružený ke každé hodnotě SQLSTATE je SQL_ERROR, pokud není uvedeno jinak.
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | Obecné upozornění | Informační zpráva specifická pro řidiče (Funkce vrátí SQL_SUCCESS_WITH_INFO.) |
| 08S01 | Selhání komunikačního propojení | Komunikační propojení mezi ovladačem a zdrojem dat, ke kterému byl ovladač připojen, selhalo před dokončením zpracování funkce. |
| 24000 | Neplatný stav kurzoru | Na StatementHandle byl otevřený kurzor a byly volány SQLFetch nebo SQLFetchScroll . Tuto chybu vrátí správce ovladačů, pokud SQLFetch nebo SQLFetchScroll nevrátil SQL_NO_DATA, a ovladač ji vrátí, pokud SQLFetch nebo SQLFetchScroll vrátily SQL_NO_DATA. Na StatementHandle byl otevřený kurzor, ale SQLFetch nebo SQLFetchScroll nebyly volány. |
| 40001 | Selhání serializace | Transakce byla vrácena zpět kvůli vzájemnému zablokování prostředku s jinou transakcí. |
| 40003 | Neznámé dokončování příkazů | Přidružené připojení se nezdařilo během provádění této funkce a stav transakce nelze určit. |
| 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á nástrojem SQLGetDiagRec v vyrovnávací paměti *MessageText popisuje chybu a její příčinu. |
| HY001 | Chyba přidělení paměti | Ovladač nemohl přidělit paměť, která je nutná k podpoře provádění nebo dokončování 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 SQLCancel nebo SQLCancelHandle pro PříkazHandle. Pak byla funkce znovu volána v StatementHandle. Funkce byla volána a před dokončením provádění byla volána funkce SQLCancel neboSQLCancelHandlez jiného vlákna v aplikaci s více vlákny. |
| HY009 | Neplatné použití ukazatele null | Atribut SQL_ATTR_METADATA_ID příkazu byl nastaven na SQL_TRUE, argument CatalogName byl nulový ukazatel a SQL_CATALOG_NAME InfoType vrací, že jsou podporována jména katalogů. (DM) Atribut SQL_ATTR_METADATA_ID příkazu byl nastaven na SQL_TRUE a argument SchemaName nebo TableName byl nulový ukazatel. |
| HY010 | Chyba posloupnosti funkcí | (DM) Byla volána asynchronně spuštěná funkce pro popisovač připojení, který je přidružen k StatementHandle. Tato asynchronní funkce se stále spouštěla, když byl volán SQLTables. (DM) SQLExecute, SQLExecDirect nebo SQLMoreResults byl volána pro StatementHandle a vrácena SQL_PARAM_DATA_AVAILABLE. Tato funkce byla volána před načtením dat pro všechny streamované parametry. (DM) Pro PříkazHandle byla volána asynchronně spuštěná funkce (ne tato) a při zavolání této funkce se stále spouštěla. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations nebo SQLSetPos byly volány pro StatementHandle a vráceny SQL_NEED_DATA. Tato funkce byla volána před odesláním dat pro všechny parametry provádění dat nebo sloupce. |
| 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) Hodnota jednoho z argumentů délky byla menší než 0, ale nebyla rovna SQL_NTS. Hodnota jednoho z argumentů délky názvu překročila maximální hodnotu délky odpovídajícího názvu. |
| 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 | Nepovinná funkce není implementována. | Byl specifikován katalog, ale ovladač nebo datový zdroj katalogy nepodporuje. Bylo specifikováno schéma a ovladač nebo zdroj dat schémata nepodporuje. Pro název katalogu, schéma tabulky nebo název tabulky byl specifikován vzor vyhledávání řetězců a zdroj dat nepodporuje vyhledávací vzory pro jeden nebo více těchto argumentů. Ovladač ani zdroj dat nepodporuje kombinaci aktuálních nastavení atributů SQL_ATTR_CONCURRENCY a SQL_ATTR_CURSOR_TYPE příkazu. Atribut příkazu SQL_ATTR_USE_BOOKMARKS byl nastaven na SQL_UB_VARIABLE a atribut příkazu SQL_ATTR_CURSOR_TYPE byl nastaven na typ kurzoru, pro který ovladač nepodporuje záložky. |
| HYT00 | Vypršel časový limit. | Vypršení časového limitu dotazu vypršelo, než zdroj dat vrátil požadovanou sadu výsledků. Časový limit je nastavený prostřednictvím sqlSetStmtAttr SQL_ATTR_QUERY_TIMEOUT. |
| HYT01 | Vypršel časový limit připojení | Platnost časového limitu připojení vypršela, než zdroj dat odpověděl na žádost. Časový limit připojení je nastavený prostřednictvím sqlSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT. |
| IM001 | Ovladač tuto funkci nepodporuje. | (DM) Ovladač přidružený k StatementHandle nepodporuje funkci. |
| 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 | K dokončení předchozí asynchronní operace na tomto popisovači nebyla volána funkce SQLCompleteAsync. | Pokud předchozí volání funkce na popisovači vrátí SQL_STILL_EXECUTING a pokud je povolen režim oznámení, musí být sqlCompleteAsync volán na popisovači, aby bylo možné provést následné zpracování a dokončit operaci. |
Comments
SQLTables uvádí všechny tabulky v požadovaném rozsahu. Uživatel může, ale nemusí mít SELECT práva k kterémukoli z těchto tabulek. Pro kontrolu přístupnosti může aplikace:
Zavolejte na SQLGetInfo a zkontrolujte typ SQL_ACCESSIBLE_TABLES informací.
Zavolejte SQLTablePrivileges a zkontrolujte oprávnění pro každou tabulku.
Jinak musí aplikace zvládnout situaci, kdy uživatel vybere tabulku, pro kterou nejsou uděleny oprávnění SELECT .
Argumenty SchemaName a TableName přijímají vyhledávací vzory. Argument CatalogName přijímá vyhledávací vzory, pokud je atribut SQL_ODBC_VERSION environment SQL_OV_ODBC3; nepřijímá vyhledávací vzory, pokud je SQL_OV_ODBC2 nastaveno. Pokud je SQL_OV_ODBC3 nastaveno, ovladač ODBC 3*.x* bude vyžadovat, aby byly v argumentu CatalogName uniknuty žolíkové znaky, aby byly brány doslovně. Pro více informací o platných vyhledávacích vzorcích viz Argumenty hodnoty vzoru.
Note
Další informace o obecném použití, argumentech a vrácených datech funkcí katalogu ODBC naleznete v tématu Funkce katalogu.
Pro podporu enumerace katalogů, schémat a typů tabulek jsou definovány následující speciální sémantiky pro argumenty CatalogName, SchemaName, TableName a TableType v SQLTables:
Pokud je CatalogName SQL_ALL_CATALOGS a SchemaName a TableName prázdné řetězce, výsledná sada obsahuje seznam platných katalogů pro datový zdroj. (Všechny sloupce kromě sloupce TABLE_CAT obsahují NULLs.)
Pokud je SchemaName SQL_ALL_SCHEMAS a CatalogName a TableName prázdné řetězce, výsledná sada obsahuje seznam platných schémat pro datový zdroj. (Všechny sloupce kromě sloupce TABLE_SCHEM obsahují NULLy.)
Pokud je TableType SQL_ALL_TABLE_TYPES a CatalogName, SchemaName a TableName prázdné řetězce, výsledná sada obsahuje seznam platných typů tabulek pro datový zdroj. (Všechny sloupce kromě sloupce TABLE_TYPE obsahují NULLs.)
Pokud TableType není prázdný řetězec, musí obsahovat seznam hodnot oddělených čárkami pro typy zájmu; Každá hodnota může být uzavřena v jedné uvozovkách (') nebo bez uvozovek, například 'TABLE', 'VIEW' nebo TABLE, VIEW. Aplikace by měla vždy uvádět typ tabulky velkými písmeny; Ovladač by měl převést typ tabulky na případ, který potřebuje datový zdroj. Pokud datový zdroj nepodporuje specifikovaný typ tabulky, SQLTables nevrací žádné výsledky pro tento typ.
SQLTables vrací výsledky jako standardní množinu výsledků, seřazenou podle TABLE_TYPE, TABLE_CAT, TABLE_SCHEM a TABLE_NAME. Informace o použití těchto informací naleznete v tématu Použití dat katalogu.
Pro určení skutečných délek sloupců TABLE_CAT, TABLE_SCHEM a TABLE_NAME může aplikace volat SQLGetInfo s typy informací SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN a SQL_MAX_TABLE_NAME_LEN.
Následující sloupce byly přejmenovány pro ODBC 3*.x*. Změny názvů sloupců neovlivňují zpětnou kompatibilitu, protože aplikace se vážou podle čísla sloupce.
| Sloupec ODBC 2.0 | ODBC 3*.x* sloupec |
|---|---|
| kvalifikátor_tabulky | TABLE_CAT |
| Vlastník tabulky | TABLE_SCHEM |
Následující tabulka uvádí sloupce v sadě výsledků. Další sloupce za sloupcem 5 (POZNÁMKY) může řidič definovat. Aplikace by měla získat přístup ke sloupcům specifickým pro ovladače tím, že odpočítává od konce sady výsledků místo určení explicitní řadové pozice. Další informace naleznete v tématu Data vrácená funkcemi katalogu.
| Název sloupce | Číslo sloupce | Datový typ | Comments |
|---|---|---|---|
| TABLE_CAT (ODBC 1.0) | 1 | Varchar | Název katalogu; NULL, pokud není relevantní pro datový zdroj. Pokud ovladač podporuje katalogy pro některé tabulky, ale ne pro jiné, například když ovladač získává data z různých DBMS, vrátí prázdný řetězec ("") pro tabulky, které katalogy nemají. |
| TABLE_SCHEM (ODBC 1.0) | 2 | Varchar | Schéma: NULL, pokud není relevantní pro datový zdroj. Pokud ovladač podporuje schémata pro některé tabulky, ale ne pro jiné, například když ovladač získává data z různých DBMS, vrátí prázdný řetězec ("") pro tabulky, které schémata nemají. |
| TABLE_NAME (ODBC 1.0) | 3 | Varchar | Název tabulky |
| TABLE_TYPE (ODBC 1.0) | 4 | Varchar | Název typu tabulky; jeden z následujících: "",TABLE "VIEW", "SYSTÉM", "GLOBÁLNÍ TABLEDOČASNÝ", "LOKÁLNÍ DOČASNÝ", "ALIAS", "SYNONYM", nebo typ specifický pro datový zdroj. Významy "ALIAS" a ""SYNONYM jsou specifické pro konkrétní ovladač. |
| POZNÁMKY (ODBC 1.0) | 5 | Varchar | Popis stolu. |
Example
Následující ukázkový kód nenabízí volné rukojeti a spojení. Viz SQLFreeHandle Function a SQLFreeStmt Function pro ukázky kódu pro volné rukojeti a příkazy.
// SQLTables.cpp
// compile with: user32.lib odbc32.lib
#include <windows.h>
#include <sqlext.h>
#include <strsafe.h>
// simple helper functions
int MySQLSuccess(SQLRETURN rc) {
return (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO);
}
struct DataBinding {
SQLSMALLINT TargetType;
SQLPOINTER TargetValuePtr;
SQLINTEGER BufferLength;
SQLLEN StrLen_or_Ind;
};
void printCatalog(const struct DataBinding* catalogResult) {
if (catalogResult[0].StrLen_or_Ind != SQL_NULL_DATA)
printf("Catalog Name = %s\n", (char *)catalogResult[0].TargetValuePtr);
}
// remember to disconnect and free memory, and free statements and handles
int main() {
int bufferSize = 1024, i, numCols = 5;
struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );
wchar_t* dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );
wchar_t* userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );
// declare and initialize the environment, connection, statement handles
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
SQLRETURN retCode;
HWND desktopHandle = GetDesktopWindow(); // desktop's window handle
SQLWCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen;
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (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, (SQLCHAR*)"Driver={SQL Server}", SQL_NTS, (SQLCHAR*)connStrbuffer, 1024 + 1, &connStrBufferLen, SQL_DRIVER_PROMPT);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferSize);
retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferSize);
bufferSize = 1024;
// allocate memory for the binding
// free this memory when done
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 );
}
// setup the binding (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));
// all catalogs query
printf( "A list of names of all catalogs\n" );
retCode = SQLTables( hstmt, (SQLCHAR*)SQL_ALL_CATALOGS, SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS, (SQLCHAR*)"", SQL_NTS );
for ( retCode = SQLFetch(hstmt) ; MySQLSuccess(retCode) ; retCode = SQLFetch(hstmt) )
printCatalog( catalogResult );
}
Související funkce
| Informace o | Podívejte se |
|---|---|
| Vytvoření vazby vyrovnávací paměti ke sloupci v sadě výsledků | SQLBindCol – funkce |
| Zrušení zpracování příkazů | SQLCancel – funkce |
| Vrácení oprávnění pro sloupec nebo sloupce | Funkce SQLColumnPrivileges |
| Vrácení sloupců v tabulce nebo tabulkách | SQLColumns Function |
| Načítání jednoho řádku nebo bloku dat pouze ve směru dopředu | Funkce SQLFetch |
| Načtení bloku dat nebo procházení sady výsledků | SQLFetchScroll – funkce |
| Statistiky a indexy v tabulkách | Funkce SQLStatistics |
| Vrácení oprávnění pro tabulku nebo tabulky | Funkce SQLTablePrivileges |