SQLTables függvény

Megfelelőség
Bemutatott verzió: ODBC 1.0 Szabványoknak megfelelés: Open Group

Összefoglalás
Az SQLTables adja vissza a táblák, katalógusok vagy sémanevek és táblaptípusok listáját, amelyeket egy adott adatforrásban tárolnak. Az illesztőprogram eredményhalmazként adja vissza az adatokat.

Syntax

  
SQLRETURN SQLTables(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      TableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      TableType,  
     SQLSMALLINT    NameLength4);  

Arguments

StatementHandle
[Bemenet] Kijelentés cím a lekért eredményekhez.

CatalogName
[Bemenet] Katalógus neve. A CatalogName argumentum akkor fogad el keresési mintákat, ha a SQL_ODBC_VERSION környezet attribútuma SQL_OV_ODBC3; nem fogad el keresési mintákat, ha SQL_OV_ODBC2 be van állítva. Ha egy illezser egyes táblákhoz támogatja a katalógusokat, míg másoknál nem, például amikor egy meghajtó különböző adatbázisokból származó adatokat tölt be, akkor egy üres string ("") jelzi azokat a táblákat, amelyeknek nincs katalógus.

Ha a SQL_ATTR_METADATA_ID utasítás attribútuma SQL_TRUE-re van beállítva, a CatalogName azonosítóként kezelik, és az esete nem jelentős. Ha SQL_FALSE, akkor a CatalogName mintaérték-argumentum; szó szerint kezelik, és az esete jelentős. További információ: A Catalog Functions argumentumai.

NameLength1
[Bemenet] A *CatalogName karakterek hossza.

Séma neve
[Bemenet] Stringkereső minta sémák nevekhez. Ha egy illesztőprogram támogatja a sémákat bizonyos táblákhoz, de másokhoz nem, például amikor az illesztőprogram adatokat kér különböző adatbázisokból, egy üres string ("") jelzi azokat a táblákat, amelyeknek nincs sémája.

Ha a SQL_ATTR_METADATA_ID állítás attribútuma SQL_TRUE-re van beállítva, akkor a SchemaName azonosítóként kezelik, és az esete nem jelentős. Ha SQL_FALSE, akkor a SchemaName mintaérték-argumentum; szó szerint kezelik, és az esete jelentős.

NameLength2
[Bemenet] Hossz a *SchemaName.

TáblaNév
[Bemenet] Stringkereső minta táblanevekhez.

Ha a SQL_ATTR_METADATA_ID állítás attribútuma SQL_TRUE-re van beállítva, a TableName azonosítóként kezelik, és az eve nem jelentős. Ha SQL_FALSE, akkor a TableName mintaérték-argumentum; szó szerint kezelik, és az esete jelentős.

NameLength3
[Bemenet] Hosszúság a *TableName.

Tábla típusa
[Bemenet] Táblázattípusok listája, amiket érdemes összeegyeztetni.

Figyeljük meg, hogy a SQL_ATTR_METADATA_ID állítás attribútuma nem befolyásolja a TableType argumentumot. A TableType értéklista argumentum, függetlenül a SQL_ATTR_METADATA_ID beállítástól.

NameLength4
[Bemenet] Hossz *TableType karakterekben.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR vagy SQL_INVALID_HANDLE.

Diagnostics

Amikor az SQLTables SQL_ERROR vagy SQL_SUCCESS_WITH_INFO értéket ad vissza, egy hozzárendelt SQLSTATE érték megkapható SQLGetDiagRec hívásával, amely egy SQL_HANDLE_STMT HandleType és egy HandleType of StatementHandle (HandleType) (StatementHandle) segítségével érhető el. Az alábbi táblázat felsorolja azokat az SQLSTATE értékeket, amelyeket általában az SQLTables adnak vissza, és mindegyiket elmagyarázza ezen függvény kontextusában; a "(DM)" jelölés megelőzi a Driver Manager által visszaadott SQLSTATE-leírásokat. Az egyes SQLSTATE-értékekhez társított visszatérési kód SQL_ERROR, kivéve, ha másként van feltüntetve.

SQLSTATE Error Description
01000 Általános figyelmeztetés Illesztőprogram-specifikus tájékoztató üzenet. (A függvény SQL_SUCCESS_WITH_INFO ad vissza.)
08S01 Kommunikációs kapcsolat hibája Az illesztőprogram és az adatforrás közötti kommunikációs kapcsolat, amelyhez az illesztőprogram csatlakoztatva volt, nem sikerült, mielőtt a függvény befejeződött a feldolgozás.
24000 Érvénytelen kurzorállapot A StatementHandle kurzora nyitva volt, és az SQLFetch vagy SQLFetchScroll hívást kapta. Ezt a hibát a Driver Manager adja vissza, ha a SQLFetch vagy SQLFetchScroll nem SQL_NO_DATA vissza, és a driver, ha SQLFetch vagy SQLFetchScroll SQL_NO_DATA visszaadta.

A kurzor nyitva volt a StatementHandle-en, de az SQLFetch vagy SQLFetchScroll nem volt meghívva.
40001 Szerializálási hiba A tranzakció egy erőforrás holtpontja miatt lett visszaállítva egy másik tranzakcióval.
40003 Az utasítás befejezése ismeretlen A társított kapcsolat a függvény végrehajtása során meghiúsult, és a tranzakció állapota nem határozható meg.
HY000 Általános hiba Hiba történt, amely miatt nem volt konkrét SQLSTATE, és amelyhez nem definiáltak implementációspecifikus SQLSTATE-t. Az SQLGetDiagRec által a *MessageText pufferben visszaadott hibaüzenet leírja a hibát és annak okát.
HY001 Memóriafoglalási hiba Az illesztőprogram nem tudta lefoglalni a függvény végrehajtásának vagy befejezésének támogatásához szükséges memóriát.
HY008 Művelet megszakítva Az aszinkron feldolgozás engedélyezve lett a StatementHandle-ben. A függvény meghívása megtörtént, és a végrehajtás befejezése előtt az SQLCancel vagy az SQLCancelHandle meghívása megtörtént az Utasításkezelőben. Ezután a függvény ismét meghívásra került az Utasításkezelőben.

A függvény meghívása megtörtént, és a végrehajtás befejezése előtt az SQLCancel vagy az SQLCancelHandle egy másik szálról lett meghívva a StatementHandle-ra egy többszálas alkalmazásból.
HY009 Érvénytelen null mutató használata A SQL_ATTR_METADATA_ID utasítás attribútumot SQL_TRUE-re állították, a CatalogName argument null mutató volt, és az SQL_CATALOG_NAME InfoType azt mutatja, hogy a katalógusnevek támogatottak.

(DM) A SQL_ATTR_METADATA_ID utasítás attribútuma SQL_TRUE-re volt beállítva, a SchemaName vagy TableName érve pedig null pointer volt.
HY010 Függvényütemezési hiba (DM) A StatementHandle-hez társított kapcsolati leíróhoz aszinkron módon végrehajtó függvény lett meghívva. Ez az aszinkron függvény még akkor futott, amikor az SQLTables-t hívták.

(DM) SQLExecute, SQLExecDirect vagy SQLMoreResults lett meghívva az Utasításkezelőhöz , és SQL_PARAM_DATA_AVAILABLE ad vissza. Ez a függvény az összes streamelt paraméter adatainak lekérése előtt lett meghívva.

(DM) Egy aszinkron módon végrehajtó függvény (nem ez) lett meghívva az StatementHandle-hez , és a függvény meghívásakor továbbra is végrehajtó volt.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations vagy SQLSetPos lett meghívva az Utasításkezelőhöz , és SQL_NEED_DATA. Ezt a függvényt az összes adatvégrehajtási paraméter vagy oszlop adatküldése előtt hívták meg.
HY013 Memóriakezelési hiba A függvényhívás nem dolgozható fel, mert a mögöttes memóriaobjektumok nem érhetők el, esetleg a memóriahiány miatt.
HY090 Érvénytelen sztring vagy puffer hossza (DM) Az egyik hosszúságú argumentum értéke kisebb volt 0-nál, de nem egyenlő SQL_NTS-vel.

A névhossz argumentumok egyikének értéke túllépte a megfelelő név maximális hosszértékét.
HY117 A kapcsolat ismeretlen tranzakciós állapot miatt fel van függesztve. Csak a leválasztási és írásvédett függvények engedélyezettek. (DM) A felfüggesztett állapotról további információt az SQLEndTran függvényben talál.
HYC00 A választható funkció nem implementálva Kijelöltek egy katalógust, és az illesztőprogram vagy adatforrás nem támogatja a katalógusokat.

Sémát határoztak meg, és az illesztőprogram vagy adatforrás nem támogatja a sémákat.

A katalógus nevéhez, táblasémájához vagy táblanévhez egy stringkereső mintát szabtak, és az adatforrás nem támogatja az egyik vagy több argumentum keresési mintázatait.

Az illesztőprogram vagy az adatforrás nem támogatja a SQL_ATTR_CONCURRENCY és SQL_ATTR_CURSOR_TYPE utasításattribútumok aktuális beállításainak kombinációját.

A SQL_ATTR_USE_BOOKMARKS utasítás attribútuma SQL_UB_VARIABLE lett beállítva, és a SQL_ATTR_CURSOR_TYPE utasítás attribútum olyan kurzortípusra lett beállítva, amelyhez az illesztőprogram nem támogatja a könyvjelzőket.
HYT00 Az időtúllépés lejárt A lekérdezés időtúllépési időtartama lejárt, mielőtt az adatforrás visszaadta a kért eredményhalmazt. Az időtúllépési időszak az SQLSetStmtAttr SQL_ATTR_QUERY_TIMEOUT keresztül van beállítva.
HYT01 A kapcsolati időkorlát lejárt A kapcsolat időtúllépési időtartama lejárt, mielőtt az adatforrás válaszolt a kérésre. A kapcsolat időtúllépési időszaka az SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT keresztül van beállítva.
IM001 Az illesztőprogram nem támogatja ezt a függvényt (DM) Az StatementHandle-hez társított illesztőprogram nem támogatja a függvényt.
IM017 A lekérdezés aszinkron értesítési módban le van tiltva Az értesítési modell használata esetén a lekérdezés le van tiltva.
IM018 Az SQLCompleteAsync nem lett meghívva az előző aszinkron művelet végrehajtásához ezen a leírón. Ha a leíró előző függvényhívása SQL_STILL_EXECUTING ad vissza, és ha az értesítési mód engedélyezve van, az SQLCompleteAsync-et a leírón kell meghívni a művelet utófeldolgozásához és befejezéséhez.

Comments

Az SQLTables felsorolja az összes táblát a kért tartományban. A felhasználónak lehetnek SELECT jogosultságai bármelyik táblához, vagy nem. Az akadálymentesség ellenőrzéséhez az alkalmazás a következőképpen segíthet:

  • Hívd fel az SQLGetInfo-t , és ellenőrizd a SQL_ACCESSIBLE_TABLES információs típust.

  • Hívd az SQLTablePrivileges-t , hogy ellenőrizze az egyes táblák jogosultságait.

Ellenkező esetben az alkalmazásnak képesnek kell lennie kezelni olyan helyzetet, amikor a felhasználó olyan táblát választ, amelyhez nem kap SELECT jogosultságot.

A SchemaName és TableName argumentumok elfogadják a keresési mintákat. A CatalogName argumentum akkor fogad el keresési mintákat, ha a SQL_ODBC_VERSION környezet attribútuma SQL_OV_ODBC3; nem fogad el keresési mintákat, ha SQL_OV_ODBC2 be van állítva. Ha SQL_OV_ODBC3 be van állítva, egy ODBC 3*.x* illezser megköveteli, hogy a CatalogName argumentusban lévő wildcard karaktereket szó szerint kezeljék. További információért az érvényes keresési mintákról lásd: Mintaérték-érvek.

Note

Az ODBC-katalógusfüggvények általános használatáról, argumentumairól és visszaadott adatairól további információt a Catalog Functions című témakörben talál.

A katalógusok, sémák és táblatípusok felsorolásának támogatásához a következő speciális szemantikákat definiáljuk az SQLTablesCatalogName, SchemaName, TableName és TableType argumentumokhoz:

  • Ha a CatalogName SQL_ALL_CATALOGS, és a SchemaName és a TableName üres stringek, akkor az eredményhalmaz tartalmazza az adatforrás érvényes katalógusainak listáját. (Minden oszlop, kivéve a TABLE_CAT oszlopot, tartalmaz NULL-okat.)

  • Ha a SchemaName SQL_ALL_SCHEMAS, és a CatalogName és a TableName üres stringek, akkor az eredményhalmaz tartalmazza az adatforrás érvényes sémáinak listáját. (Minden oszlop, kivéve a TABLE_SCHEM oszlopot, tartalmaz NULL-okat.)

  • Ha a TableType SQL_ALL_TABLE_TYPES, és a CatalogName, SchemaName és TableName üres stringek, akkor az eredményhalmaz tartalmazza az adatforrás érvényes táblatípusainak listáját. (Minden oszlop, kivéve a TABLE_TYPE oszlopot, tartalmaz NULL-okat.)

Ha a TableType nem üres string, akkor tartalmaznia kell egy verésszel elválasztott értékeket az érdekelt típusokhoz; minden érték idézőjelben (') vagy idézetjel nélkül is bevonható, például 'TABLE', 'VIEW' vagy TABLE, VIEW. Egy alkalmazásnak mindig nagybetűkkel kell megadnia a táblatípust; Az illesztőprogramnak a táblatípust az adatforrás által szükséges esetre kell átalakítania. Ha az adatforrás nem támogatja egy meghatározott táblatípust, az SQLTables nem ad eredményt az adott típusra.

Az SQLTables az eredményeket szabványos eredményhalmazként adja vissza, TABLE_TYPE, TABLE_CAT, TABLE_SCHEM és TABLE_NAME sorrendben. Az információk felhasználási módjáról további információt a katalógusadatok felhasználási módjai című témakörben talál.

A TABLE_CAT, TABLE_SCHEM és TABLE_NAME oszlopok tényleges hosszának meghatározásához egy alkalmazás hívhatja az SQLGetInfo-t a SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN és SQL_MAX_TABLE_NAME_LEN információtípusokkal.

A következő oszlopokat átnevezték az ODBC 3*.x* alapján. Az oszlopnév változása nem befolyásolja a visszafelé kompatibilitást, mivel az alkalmazások oszlopszám alapján kötnek hozzá.

ODBC 2.0 oszlop ODBC 3*.x* oszlop
TÁBLÁZAT_JELZŐ TABLE_CAT
TÁBLÁZAT_TULAJDONOS TABLE_SCHEM

Az alábbi táblázat az eredményhalmaz oszlopait sorolja fel. Az 5. oszlopon (MEGJEGYZÉSEK) túl további oszlopokat a meghajtó definiálhat. Az alkalmazásnak hozzáférést kell szereznie az illesztőprogram-specifikus oszlopokhoz úgy, hogy az eredményhalmaz végétől lefelé számlál, nem pedig explicit sorrendi pozíciót ad meg. További információ: Catalog Functions által visszaadott adatok.

Oszlop neve Oszlopszám Adattípus Comments
TABLE_CAT (ODBC 1.0) 1 Varchar Katalógus neve; NULL, ha nem vonatkozik az adatforrásra. Ha egy illezser egyes táblákhoz támogatja a katalógusokat, míg másoknál nem, például amikor az illesztőprogram adatokat tölt be különböző adatbázisokból, akkor üres stringet ("") ad vissza azokra a táblákra, amelyeknek nincs katalógus.
TABLE_SCHEM (ODBC 1.0) 2 Varchar Séma név; NULL, ha nem vonatkozik az adatforrásra. Ha egy illezser egyes táblákhoz támogatja a sémákat, míg másoknál nem, például amikor az illesztőprogram adatokat kér különböző adatbázisokból, akkor üres stringet ("") ad vissza azokra a táblákra, amelyeknek nincs sémájuk.
TABLE_NAME (ODBC 1.0) 3 Varchar Tábla neve.
TABLE_TYPE (ODBC 1.0) 4 Varchar Táblatípus név; az alábbiak egyike: "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYMvagy adatforrás-specifikus típusnév.

Az "ALIAS" és "SYNONYM" jelentései illetékes-specifikusak.
MEGJEGYZÉSEK (ODBC 1.0) 5 Varchar Az asztal leírása.

Example

A következő mintakód nem szabadít fel handle-eket és kapcsolatokat. A processzorok és utasítások szabad kódmintáihoz lásd a SQLFreeHandle Function és SQLFreeStmt Function menüpontokat.

// 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 );  
}  
Információ erről: Nézze
Puffer kötése egy eredményhalmaz oszlopához SQLBindCol függvény
Utasításfeldolgozás megszakítása SQLCancel függvény
Jogosultságok visszaküldése egy oszlop vagy oszlopok számára SQLColumnPrivileges Function
A táblázat vagy táblák oszlopainak visszaküldése SQLColumns függvény
Egy sor vagy adatblokk előrelépési irányban történő lekérése SQLFetch függvény
Adatblokk beolvasása vagy egy eredményhalmaz görgetése SQLFetchScroll függvény
Táblázatstatisztikák és indexek visszaadása SQLStatistics Function
Visszaadva a jogosultságok egy asztalhoz vagy táblákhoz SQLTablePrivileges Function

Lásd még

ODBC API-referencia
ODBC-fejlécfájlok