SQLColAttribute-Funktion

Konformität
Version eingeführt: ODBC 3.0 Standards Compliance: ISO 92

Zusammenfassung
SQLColAttribute gibt Deskriptorinformationen für eine Spalte in einem Resultset zurück. Deskriptorinformationen werden als Zeichenfolge, deskriptorabhängiger Wert oder ganzzahliger Wert zurückgegeben.

Hinweis

Weitere Informationen dazu, was der Treiber-Manager diese Funktion bei odbc 3 zuordnet. Die x-Anwendung arbeitet mit odbc 2. x-Treiber , siehe Zuordnung von Ersatzfunktionen für die Abwärtskompatibilität von Anwendungen.

Syntax

  
SQLRETURN SQLColAttribute (  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ColumnNumber,  
      SQLUSMALLINT    FieldIdentifier,  
      SQLPOINTER      CharacterAttributePtr,  
      SQLSMALLINT     BufferLength,  
      SQLSMALLINT *   StringLengthPtr,  
      SQLLEN *        NumericAttributePtr);  

Argumente

StatementHandle
[Eingabe] Anweisungshandle.

ColumnNumber
[Eingabe] Die Nummer des Datensatzes in der IRD, aus dem der Feldwert abgerufen werden soll. Dieses Argument entspricht der Spaltenanzahl der Ergebnisdaten, die sequenziell in erhöhter Spaltenreihenfolge sortiert werden und bei 1 beginnen. Spalten können in beliebiger Reihenfolge beschrieben werden.

Spalte 0 kann in diesem Argument angegeben werden, aber alle Werte außer SQL_DESC_TYPE und SQL_DESC_OCTET_LENGTH geben nicht definierte Werte zurück.

FieldIdentifier
[Eingabe] Das Deskriptorhandle. Dieses Handle definiert, welches Feld in der IRD abgefragt werden soll (z. B. SQL_COLUMN_TABLE_NAME).

CharacterAttributePtr
[Ausgabe] Zeiger auf einen Puffer, in dem der Wert im Feld FieldIdentifier der ColumnNumber-Zeile der IRD zurückgegeben werden soll, wenn das Feld eine Zeichenfolge ist. Andernfalls wird das Feld nicht verwendet.

Wenn CharacterAttributePtr NULL ist, gibt StringLengthPtr weiterhin die Gesamtanzahl der Bytes (mit Ausnahme des NULL-Terminierungszeichens für Zeichendaten) zurück, die im Puffer zurückgegeben werden können, auf den characterAttributePtr verweist.

BufferLength
[Eingabe] Wenn FieldIdentifier ein von ODBC definiertes Feld ist und CharacterAttributePtr auf eine Zeichenfolge oder einen binären Puffer zeigt, sollte dieses Argument die Länge von *CharacterAttributePtr haben. Wenn FieldIdentifier ein von ODBC definiertes Feld und *CharacterAttributePtr eine ganze Zahl ist, wird dieses Feld ignoriert. Wenn * CharacterAttributePtr eine Unicode-Zeichenfolge ist (beim Aufrufen von SQLColAttributeW), muss das BufferLength-Argument eine gerade Zahl sein. Wenn FieldIdentifier ein vom Treiber definiertes Feld ist, gibt die Anwendung dem Treiber-Manager die Art des Felds an, indem sie das BufferLength-Argument festlegt. BufferLength kann die folgenden Werte aufweisen:

  • Wenn CharacterAttributePtr ein Zeiger auf einen Zeiger ist, sollte BufferLength den Wert SQL_IS_POINTER haben.

  • Wenn CharacterAttributePtr ein Zeiger auf eine Zeichenfolge ist, ist bufferLength die Länge des Puffers.

  • Wenn CharacterAttributePtr ein Zeiger auf einen binären Puffer ist, platziert die Anwendung das Ergebnis des makros SQL_LEN_BINARY_ATTR(length) in BufferLength. Dadurch wird ein negativer Wert in BufferLength platziert.

  • Wenn CharacterAttributePtr ein Zeiger auf einen Datentyp mit fester Länge ist, muss BufferLength einer der folgenden Sein: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT oder SQL_IS_USMALLINT.

StringLengthPtr
[Ausgabe] Zeiger auf einen Puffer, in dem die Gesamtzahl der Bytes (mit Ausnahme des NULL-Terminierungsbytes für Zeichendaten) zurückgegeben werden soll, die in *CharacterAttributePtr zurückgegeben werden können.

Wenn die Anzahl der zurückzugebenden Bytes für Zeichendaten größer oder gleich BufferLength ist, werden die Deskriptorinformationen in *CharacterAttributePtr in BufferLength abzüglich der Länge eines NULL-Terminierungszeichens abgeschnitten und vom Treiber null beendet.

Für alle anderen Datentypen wird der Wert von BufferLength ignoriert, und der Treiber geht davon aus, dass die Größe von *CharacterAttributePtr 32 Bit beträgt.

NumericAttributePtr
[Ausgabe] Zeiger auf einen ganzzahligen Puffer, in dem der Wert im Feld FieldIdentifier der ColumnNumber-Zeile der IRD zurückgegeben werden soll, wenn das Feld ein numerischer Deskriptortyp ist, z. B. SQL_DESC_COLUMN_LENGTH. Andernfalls wird das Feld nicht verwendet. Beachten Sie, dass einige Treiber nur die untere 32-Bit- oder 16-Bit-Version eines Puffers schreiben und das Bit höherer Reihenfolge unverändert lassen. Daher sollten Anwendungen den Wert auf 0 initialisieren, bevor sie diese Funktion aufrufen.

Gibt zurück

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR oder SQL_INVALID_HANDLE.

Diagnose

Wenn SQLColAttribute entweder SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugeordneter SQLSTATE-Wert abgerufen werden, indem SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle of StatementHandle aufgerufen wird. In der folgenden Tabelle sind die SQLSTATE-Werte aufgeführt, die häufig von SQLColAttribute zurückgegeben werden, und die einzelnen Werte werden im Kontext dieser Funktion erläutert. die Notation "(DM)" steht vor den Beschreibungen von SQLSTATEs, die vom Treiber-Manager zurückgegeben werden. Der Rückgabecode, der jedem SQLSTATE-Wert zugeordnet ist, ist SQL_ERROR, sofern nicht anders angegeben.

SQLSTATE Fehler BESCHREIBUNG
01000 Allgemeine Warnung Treiberspezifische Informationsmeldung. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
01004 Zeichenfolgendaten, rechts abgeschnitten Der Puffer *CharacterAttributePtr war nicht groß genug, um den gesamten Zeichenfolgenwert zurückzugeben, sodass der Zeichenfolgenwert abgeschnitten wurde. Die Länge des unwahren Zeichenfolgenwerts wird in *StringLengthPtr zurückgegeben. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.)
07005 Vorbereitete Anweisung, keine Cursorspezifikation Die Anweisung, die dem StatementHandle zugeordnet ist, hat kein Resultset zurückgegeben, und FieldIdentifier wurde nicht SQL_DESC_COUNT. Es gab keine Spalten zu beschreiben.
07009 Ungültiger Deskriptorindex (DM) Der für ColumnNumber angegebene Wert war gleich 0, und das Attribut der SQL_ATTR_USE_BOOKMARKS-Anweisung wurde SQL_UB_OFF.

Der für das Argument ColumnNumber angegebene Wert war größer als die Anzahl der Spalten im Resultset.
HY000 Allgemeiner Fehler Es ist ein Fehler aufgetreten, für den kein spezifischer SQLSTATE-Wert vorhanden war und für den keine implementierungsspezifische SQLSTATE definiert wurde. Die von SQLGetDiagField aus der Diagnosedatenstruktur zurückgegebene Fehlermeldung beschreibt den Fehler und seine Ursache.
HY001 Fehler bei der Speicherbelegung Der Treiber konnte keinen Arbeitsspeicher zuordnen, der für die Unterstützung der Ausführung oder Fertigstellung der Funktion erforderlich ist.
HY008 Vorgang abgebrochen Die asynchrone Verarbeitung wurde für statementHandle aktiviert. Die Funktion wurde aufgerufen, und vor Abschluss der Ausführung wurde SQLCancel oder SQLCancelHandle für statementHandle aufgerufen. Anschließend wurde die Funktion für die AnweisungHandle erneut aufgerufen.

Die Funktion wurde aufgerufen, und bevor die Ausführung abgeschlossen wurde, wurde SQLCancel oder SQLCancelHandle für die StatementHandle aus einem anderen Thread in einer Multithreadanwendung aufgerufen.
HY010 Funktionssequenzfehler (DM) Eine asynchron ausgeführte Funktion wurde für das Verbindungshandle aufgerufen, das dem StatementHandle zugeordnet ist. Diese aynchrone Funktion wurde noch ausgeführt, als SQLColAttribute aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect oder SQLMoreResults wurde für statementHandle aufgerufen und SQL_PARAM_DATA_AVAILABLE zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle gestreamten Parameter abgerufen wurden.

(DM) Die Funktion wurde vor dem Aufrufen von SQLPrepare, SQLExecDirect oder einer Katalogfunktion für statementHandle aufgerufen.

(DM) Eine asynchron ausgeführte Funktion (nicht diese) wurde für das StatementHandle aufgerufen und wurde noch ausgeführt, als diese Funktion aufgerufen wurde.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations oder SQLSetPos wurde für statementHandle aufgerufen und SQL_NEED_DATA zurückgegeben. Diese Funktion wurde aufgerufen, bevor Daten für alle Daten bei der Ausführungsparameter oder -spalten gesendet wurden.
HY013 Fehler bei der Speicherverwaltung Der Funktionsaufruf konnte nicht verarbeitet werden, weil auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund von geringen Arbeitsspeicherbedingungen.
HY090 Ungültige Zeichenfolgen- oder Pufferlänge (DM) *CharacterAttributePtr ist eine Zeichenfolge, und BufferLength war kleiner als 0, aber nicht gleich SQL_NTS.
HY091 Ungültiger Deskriptorfeldbezeichner Der für das Argument FieldIdentifier angegebene Wert war keiner der definierten Werte und kein durch die Implementierung definierter Wert.
HY117 Die Verbindung wird aufgrund eines unbekannten Transaktionsstatus angehalten. Nur Trennen und schreibgeschützte Funktionen sind zulässig. (DM) Weitere Informationen zum Angehaltenen Zustand finden Sie unter SQLEndTran-Funktion.
HYC00 Treiber nicht fähig Der für das Argument FieldIdentifier angegebene Wert wurde vom Treiber nicht unterstützt.
HYT01 Verbindungstimeout abgelaufen Der Zeitraum für das Verbindungstimeout ist abgelaufen, bevor die Datenquelle auf die Anforderung reagiert hat. Der Zeitraum für das Verbindungstimeout wird über SQLSetConnectAttr festgelegt, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Der Treiber unterstützt diese Funktion nicht. (DM) Der der StatementHandle zugeordnete Treiber unterstützt die Funktion nicht.
IM017 Die Abfrage ist im asynchronen Benachrichtigungsmodus deaktiviert. Wenn das Benachrichtigungsmodell verwendet wird, ist die Abfrage deaktiviert.
IM018 SQLCompleteAsync wurde nicht aufgerufen, um den vorherigen asynchronen Vorgang für dieses Handle abzuschließen. Wenn der vorherige Funktionsaufruf für das Handle SQL_STILL_EXECUTING zurückgibt und der Benachrichtigungsmodus aktiviert ist, muss SQLCompleteAsync für das Handle aufgerufen werden, um die Nachverarbeitung durchzuführen und den Vorgang abzuschließen.

Beim Aufruf nach SQLPrepare und vor SQLExecute kann SQLColAttribute jeden SQLSTATE zurückgeben, der von SQLPrepare oder SQLExecute zurückgegeben werden kann, je nachdem, wann die Datenquelle die SQL-Anweisung auswertet, die dem StatementHandle zugeordnet ist.

Aus Leistungsgründen sollte eine Anwendung SQLColAttribute nicht aufrufen, bevor eine Anweisung ausgeführt wird.

Kommentare

Informationen dazu, wie Anwendungen die von SQLColAttribute zurückgegebenen Informationen verwenden, finden Sie unter Resultsetmetadaten.

SQLColAttribute gibt Informationen entweder in *NumericAttributePtr oder in *CharacterAttributePtr zurück. Ganzzahlige Informationen werden in *NumericAttributePtr als SQLLEN-Wert zurückgegeben. alle anderen Informationsformate werden in *CharacterAttributePtr zurückgegeben. Wenn Informationen in *NumericAttributePtr zurückgegeben werden, ignoriert der Treiber CharacterAttributePtr, BufferLength und StringLengthPtr. Wenn Informationen in *CharacterAttributePtr zurückgegeben werden, ignoriert der Treiber NumericAttributePtr.

SQLColAttribute gibt Werte aus den Deskriptorfeldern des IRD zurück. Die Funktion wird mit einem Anweisungshandle und nicht mit einem Deskriptorhandle aufgerufen. Die von SQLColAttribute für die weiter unten in diesem Abschnitt aufgeführten FieldIdentifier-Werte zurückgegebenen Werte können auch durch Aufrufen von SQLGetDescField mit dem entsprechenden IRD-Handle abgerufen werden.

Die derzeit definierten Deskriptorfelder, die Version von ODBC, in der sie eingeführt wurden, und die Argumente, in denen Informationen für sie zurückgegeben werden, werden weiter unten in diesem Abschnitt gezeigt. Weitere Deskriptortypen können von Treibern definiert werden, um verschiedene Datenquellen zu nutzen.

Odbc 3. Der x-Treiber muss einen Wert für jedes Deskriptorfeld zurückgeben. Wenn ein Deskriptorfeld nicht für einen Treiber oder eine Datenquelle gilt und sofern nicht anders angegeben, gibt der Treiber 0 in *StringLengthPtr oder eine leere Zeichenfolge in *CharacterAttributePtr zurück.

Backward Compatibility

ODBC 3. Die x-FunktionSQLColAttribute ersetzt das veraltete ODBC 2. x-FunktionSQLColAttributes. Beim Zuordnen von SQLColAttributes zu SQLColAttribute (wenn odbc 2. Die x-Anwendung arbeitet mit ODBC 3. x-Treiber ) oder Zuordnen von SQLColAttribute zu SQLColAttributes (wenn ODBC 3. Die x-Anwendung arbeitet mit ODBC 2. x treiber), der Treiber-Manager übergibt entweder den Wert von FieldIdentifier , ordnet ihn einem neuen Wert zu oder gibt wie folgt einen Fehler zurück:

Hinweis

Das Präfix, das in FieldIdentifier-Werten in ODBC 3 verwendet wird. x wurde gegenüber dem in ODBC 2 verwendeten geändert. x. Das neue Präfix lautet "SQL_DESC"; das alte Präfix lautete "SQL_COLUMN".

  • Wenn der #define Wert von ODBC 2. xFieldIdentifier ist mit dem #define Wert von ODBC 3 identisch. xFieldIdentifier, der Wert im Funktionsaufruf wird einfach übergeben.

  • Die #define Werte von ODBC 2. xFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION und SQL_COLUMN_SCALE unterscheiden sich von den #define Werten von ODBC 3. xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE und SQL_DESC_LENGTH. Odbc 2. Der x-Treiber muss nur ODBC 2 unterstützen. x-Werte . Odbc 3. Der x-Treiber muss sowohl die Werte "SQL_COLUMN" als auch "SQL_DESC" für diese drei FieldIdentifier unterstützen. Diese Werte unterscheiden sich, da Genauigkeit, Skalierung und Länge in ODBC 3 unterschiedlich definiert werden. x als in ODBC 2. x. Weitere Informationen finden Sie unter Spaltengröße, Dezimalstellen, Oktettlänge übertragen und Anzeigegröße.

  • Wenn der #define Wert von ODBC 2. xFieldIdentifier unterscheidet sich vom #define Wert von ODBC 3. xFieldIdentifier, wie bei den Werten COUNT, NAME und NULLABLE, wird der Wert im Funktionsaufruf dem entsprechenden Wert zugeordnet. Beispielsweise wird SQL_COLUMN_COUNT SQL_DESC_COUNT zugeordnet, und SQL_DESC_COUNT wird abhängig von der Richtung der Zuordnung SQL_COLUMN_COUNT zugeordnet.

  • Wenn FieldIdentifier ein neuer Wert in ODBC 3 ist. x, für das in ODBC 2 kein entsprechender Wert vorhanden war. x, es wird nicht zugeordnet, wenn odbc 3. x application verwendet es in einem Aufruf von SQLColAttribute in odbc 2. x-Treiber , und der Aufruf gibt SQLSTATE HY091 (Ungültiger Deskriptorfeldbezeichner) zurück.

In der folgenden Tabelle sind die von SQLColAttribute zurückgegebenen Deskriptortypen aufgeführt. Der Typ für NumericAttributePtr-Werte ist SQLLEN *.

FieldIdentifier Information

Zurückgegeben in
BESCHREIBUNG
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) NumericAttributePtr SQL_TRUE, ob es sich bei der Spalte um eine automatisch erhöhende Spalte handelt.

SQL_FALSE, wenn die Spalte keine automatisch inkrementierende Spalte ist oder nicht numerisch ist.

Dieses Feld ist nur für numerische Datentypspalten gültig. Eine Anwendung kann Werte in eine Zeile einfügen, die eine Autoinkrementspalte enthält, aber in der Regel keine Werte in der Spalte aktualisieren.

Wenn ein Einfügevorgang in eine Autoinkrementspalte erfolgt, wird zur Einfügezeit ein eindeutiger Wert in die Spalte eingefügt. Das Inkrement ist nicht definiert, sondern datenquellenspezifisch. Eine Anwendung sollte nicht davon ausgehen, dass eine Autoinkrementspalte an einem bestimmten Punkt oder Inkrement um einen bestimmten Wert beginnt.
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) CharacterAttributePtr Der Name der Basisspalte für die Resultsetspalte. Wenn kein Basisspaltenname vorhanden ist (wie bei Spalten, die Ausdrücke sind), enthält diese Variable eine leere Zeichenfolge.

Diese Informationen werden aus dem SQL_DESC_BASE_COLUMN_NAME Datensatzfeld des IRD zurückgegeben, bei dem es sich um ein schreibgeschütztes Feld handelt.
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) CharacterAttributePtr Der Name der Basistabelle, die die Spalte enthält. Wenn der Name der Basistabelle nicht definiert werden kann oder nicht zutreffend ist, enthält diese Variable eine leere Zeichenfolge.

Diese Informationen werden aus dem SQL_DESC_BASE_TABLE_NAME Datensatzfeld des IRD zurückgegeben, bei dem es sich um ein schreibgeschütztes Feld handelt.
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) NumericAttributePtr SQL_TRUE, wenn in der Spalte bei Sortierungen und Vergleichen die Groß-/Kleinschreibung beachtet wird.

SQL_FALSE, wenn die Groß-/Kleinschreibung für Sortierungen und Vergleiche in der Spalte nicht beachtet wird oder nicht als Charakteristischer gilt.
SQL_DESC_CATALOG_NAME (ODBC 2.0) CharacterAttributePtr Der Katalog der Tabelle, die die Spalte enthält. Der zurückgegebene Wert ist implementierungsdefiniert, wenn es sich bei der Spalte um einen Ausdruck handelt oder wenn die Spalte Teil einer Sicht ist. Wenn die Datenquelle keine Kataloge unterstützt oder der Katalogname nicht bestimmt werden kann, wird eine leere Zeichenfolge zurückgegeben. Dieses VARCHAR-Datensatzfeld ist nicht auf 128 Zeichen beschränkt.
SQL_DESC_CONCISE_TYPE (ODBC 1.0) NumericAttributePtr Der prägnante Datentyp.

Für die Datentypen datetime und interval gibt dieses Feld den präzisen Datentyp zurück. beispielsweise SQL_TYPE_TIME oder SQL_INTERVAL_YEAR. (Weitere Informationen finden Sie unter Datentypbezeichner und Deskriptoren in Anhang D: Datentypen.)

Diese Informationen werden aus dem SQL_DESC_CONCISE_TYPE Datensatzfeld des IRD zurückgegeben.
SQL_DESC_COUNT (ODBC 1.0) NumericAttributePtr Die Anzahl der im Resultset verfügbaren Spalten. Dadurch wird 0 zurückgegeben, wenn keine Spalten im Resultset vorhanden sind. Der Wert im ColumnNumber-Argument wird ignoriert.

Diese Informationen werden aus dem SQL_DESC_COUNT Kopfzeilenfeld des IRD zurückgegeben.
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) NumericAttributePtr Maximale Anzahl von Zeichen, die zum Anzeigen von Daten aus der Spalte erforderlich sind. Weitere Informationen zur Anzeigegröße finden Sie unter Spaltengröße, Dezimalstellen, Übertragungs oktettlänge und Anzeigegröße in Anhang D: Datentypen.
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) NumericAttributePtr SQL_TRUE, wenn die Spalte eine feste Genauigkeit und eine nichtzero-Skalierung aufweist, die datenquellenspezifisch sind.

SQL_FALSE, wenn die Spalte nicht über eine festgelegte Genauigkeit und eine nichtzerobasierte Skalierung verfügt, die datenquellenspezifisch sind.
SQL_DESC_LABEL (ODBC 2.0) CharacterAttributePtr Die Spaltenbezeichnung oder der Titel. Beispielsweise kann eine Spalte mit dem Namen EmpName mitarbeitername oder mit einem Alias beschriftet sein.

Wenn eine Spalte keine Bezeichnung aufweist, wird der Spaltenname zurückgegeben. Wenn die Spalte nicht beschriftet und unbenannt ist, wird eine leere Zeichenfolge zurückgegeben.
SQL_DESC_LENGTH (ODBC 3.0) NumericAttributePtr Ein numerischer Wert, der entweder die maximale oder tatsächliche Zeichenlänge einer Zeichenfolge oder eines binären Datentyps ist. Dies ist die maximale Zeichenlänge für einen Datentyp mit fester Länge oder die tatsächliche Zeichenlänge für einen Datentyp mit variabler Länge. Sein Wert schließt immer das NULL-Terminierungsbyte aus, das die Zeichenfolge beendet.

Diese Informationen werden aus dem SQL_DESC_LENGTH Datensatzfeld des IRD zurückgegeben.

Weitere Informationen zur Länge finden Sie unter Spaltengröße, Dezimalstellen, Übertragungs oktettlänge und Anzeigegröße in Anhang D: Datentypen.
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) CharacterAttributePtr Dieses VARCHAR(128)-Datensatzfeld enthält die Zeichen, die der Treiber als Präfix für ein Literal dieses Datentyps erkennt. Dieses Feld enthält eine leere Zeichenfolge für einen Datentyp, für den kein Literalpräfix gilt. Weitere Informationen finden Sie unter Literalpräfixe und Suffixe.
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) CharacterAttributePtr Dieses VARCHAR(128)-Datensatzfeld enthält die Zeichen, die der Treiber als Suffix für ein Literal dieses Datentyps erkennt. Dieses Feld enthält eine leere Zeichenfolge für einen Datentyp, für den kein Literalsuffix gilt. Weitere Informationen finden Sie unter Literalpräfixe und Suffixe.
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) CharacterAttributePtr Dieses VARCHAR(128)-Datensatzfeld enthält einen beliebigen lokalisierten Namen (native Sprache) für den Datentyp, der sich vom regulären Namen des Datentyps unterscheiden kann. Wenn kein lokalisierter Name vorhanden ist, wird eine leere Zeichenfolge zurückgegeben. Dieses Feld dient nur zu Anzeigezwecken. Der Zeichensatz der Zeichenfolge ist gebietsschemaabhängig und ist in der Regel der Standardzeichensatz des Servers.
SQL_DESC_NAME (ODBC 3.0) CharacterAttributePtr Der Spaltenalias, falls zutreffend. Wenn der Spaltenalias nicht zutrifft, wird der Spaltenname zurückgegeben. In beiden Fällen ist SQL_DESC_UNNAMED auf SQL_NAMED festgelegt. Wenn kein Spaltenname oder Spaltenalias vorhanden ist, wird eine leere Zeichenfolge zurückgegeben, und SQL_DESC_UNNAMED wird auf SQL_UNNAMED festgelegt.

Diese Informationen werden aus dem SQL_DESC_NAME Datensatzfeld des IRD zurückgegeben.
SQL_DESC_NULLABLE (ODBC 3.0) NumericAttributePtr SQL_ NULLABLE, wenn die Spalte NULL-Werte aufweisen kann; SQL_NO_NULLS, wenn die Spalte keine NULL-Werte aufweist; oder SQL_NULLABLE_UNKNOWN, wenn nicht bekannt ist, ob die Spalte NULL-Werte akzeptiert.

Diese Informationen werden aus dem Feld SQL_DESC_NULLABLE Datensatz des IRD zurückgegeben.
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) NumericAttributePtr Wenn der Datentyp im feld SQL_DESC_TYPE ein ungefährer numerischer Datentyp ist, enthält dieses SQLINTEGER-Feld den Wert 2, da das feld SQL_DESC_PRECISION die Anzahl der Bits enthält. Wenn der Datentyp im Feld SQL_DESC_TYPE ein exakter numerischer Datentyp ist, enthält dieses Feld den Wert 10, da das feld SQL_DESC_PRECISION die Anzahl der Dezimalstellen enthält. Dieses Feld ist für alle nicht numerischen Datentypen auf 0 festgelegt.
SQL_DESC_OCTET_LENGTH (ODBC 3.0) NumericAttributePtr Die Länge einer Zeichenfolge oder eines binären Datentyps in Bytes. Bei Zeichen- oder Binärtypen mit fester Länge ist dies die tatsächliche Länge in Bytes. Bei Zeichen- oder Binärtypen mit variabler Länge ist dies die maximale Länge in Bytes. Dieser Wert enthält nicht den NULL-Abschlussator.

Diese Informationen werden aus dem Feld SQL_DESC_OCTET_LENGTH Datensatz des IRD zurückgegeben.

Weitere Informationen zur Länge finden Sie unter Spaltengröße, Dezimalstellen, Übertragungs oktettlänge und Anzeigegröße in Anhang D: Datentypen.
SQL_DESC_PRECISION (ODBC 3.0) NumericAttributePtr Ein numerischer Wert, der für einen numerischen Datentyp die anwendbare Genauigkeit angibt. Bei Datentypen SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP und allen Intervalldatentypen, die ein Zeitintervall darstellen, ist sein Wert die anwendbare Genauigkeit der Sekundenbruchteilkomponente.

Diese Informationen werden aus dem Feld SQL_DESC_PRECISION Datensatz des IRD zurückgegeben.
SQL_DESC_SCALE (ODBC 3.0) NumericAttributePtr Ein numerischer Wert, der die anwendbare Skalierung für einen numerischen Datentyp darstellt. Für DECIMAL- und NUMERIC-Datentypen ist dies die definierte Skalierung. Sie ist für alle anderen Datentypen undefiniert.

Diese Informationen werden aus dem Feld SCALE-Datensatz des IRD zurückgegeben.
SQL_DESC_SCHEMA_NAME (ODBC 2.0) CharacterAttributePtr Das Schema der Tabelle, die die Spalte enthält. Der zurückgegebene Wert ist implementierungsdefiniert, wenn es sich bei der Spalte um einen Ausdruck handelt oder wenn die Spalte Teil einer Sicht ist. Wenn die Datenquelle keine Schemas unterstützt oder der Schemaname nicht bestimmt werden kann, wird eine leere Zeichenfolge zurückgegeben. Dieses VARCHAR-Datensatzfeld ist nicht auf 128 Zeichen beschränkt.
SQL_DESC_SEARCHABLE (ODBC 1.0) NumericAttributePtr SQL_PRED_NONE, wenn die Spalte nicht in einer WHERE-Klausel verwendet werden kann. (Dies entspricht dem SQL_UNSEARCHABLE-Wert in ODBC 2. x.)

SQL_PRED_CHAR, wenn die Spalte in einer WHERE-Klausel verwendet werden kann, aber nur mit dem LIKE-Prädikat. (Dies entspricht dem SQL_LIKE_ONLY-Wert in ODBC 2. x.)

SQL_PRED_BASIC, ob die Spalte in einer WHERE-Klausel mit allen Vergleichsoperatoren mit Ausnahme von LIKE verwendet werden kann. (Dies ist identisch mit dem SQL_EXCEPT_LIKE-Wert in ODBC 2. x.)

SQL_PRED_SEARCHABLE, ob die Spalte in einer WHERE-Klausel mit einem beliebigen Vergleichsoperator verwendet werden kann.

Spalten vom Typ SQL_LONGVARCHAR und SQL_LONGVARBINARY geben normalerweise SQL_PRED_CHAR zurück.
SQL_DESC_TABLE_NAME (ODBC 2.0) CharacterAttributePtr Der Name der Tabelle, die die Spalte enthält. Der zurückgegebene Wert ist implementierungsdefiniert, wenn es sich bei der Spalte um einen Ausdruck handelt oder wenn die Spalte Teil einer Sicht ist.

Wenn der Tabellenname nicht bestimmt werden kann, wird eine leere Zeichenfolge zurückgegeben.
SQL_DESC_TYPE (ODBC 3.0) NumericAttributePtr Ein numerischer Wert, der den SQL-Datentyp angibt.

Wenn ColumnNumber gleich 0 ist, wird SQL_BINARY für Lesezeichen mit variabler Länge zurückgegeben, und SQL_INTEGER wird für Lesezeichen mit fester Länge zurückgegeben.

Für die Datentypen datetime und interval gibt dieses Feld den ausführlichen Datentyp zurück: SQL_DATETIME oder SQL_INTERVAL. (Weitere Informationen finden Sie unter Datentypbezeichner und Deskriptoren in Anhang D: Datentypen.

Diese Informationen werden aus dem Feld SQL_DESC_TYPE Datensatz des IRD zurückgegeben. Hinweis: Zum Arbeiten mit ODBC 2. x-Treiber , verwenden Sie stattdessen SQL_DESC_CONCISE_TYPE.
SQL_DESC_TYPE_NAME (ODBC 1.0) CharacterAttributePtr Datenquellenabhängiger Datentypname; beispielsweise "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" oder "CHAR ( ) FOR BIT DATA".

Wenn der Typ unbekannt ist, wird eine leere Zeichenfolge zurückgegeben.
SQL_DESC_UNNAMED (ODBC 3.0) NumericAttributePtr SQL_NAMED oder SQL_UNNAMED. Wenn das Feld SQL_DESC_NAME des IRD einen Spaltenalias oder einen Spaltennamen enthält, wird SQL_NAMED zurückgegeben. Wenn kein Spaltenname oder Spaltenalias vorhanden ist, wird SQL_UNNAMED zurückgegeben.

Diese Informationen werden aus dem Feld SQL_DESC_UNNAMED Datensatz des IRD zurückgegeben.
SQL_DESC_UNSIGNED (ODBC 1.0) NumericAttributePtr SQL_TRUE, wenn die Spalte ohne Vorzeichen (oder nicht numerisch) ist.

SQL_FALSE, wenn die Spalte signiert ist.
SQL_DESC_UPDATABLE (ODBC 1.0) NumericAttributePtr Die Spalte wird durch die Werte für die definierten Konstanten beschrieben:

SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN

SQL_DESC_UPDATABLE beschreibt die Updatability der Spalte im Resultset, nicht die Spalte in der Basistabelle. Die Updatability der Basisspalte, auf der die Resultsetspalte basiert, kann sich vom Wert in diesem Feld unterscheiden. Ob eine Spalte aktualisierbar ist, kann auf dem Datentyp, den Benutzerberechtigungen und der Definition des Resultsets selbst basieren. Wenn unklar ist, ob eine Spalte aktualisierbar ist, sollte SQL_ATTR_READWRITE_UNKNOWN zurückgegeben werden.

SQLColAttribute ist eine erweiterbare Alternative zu SQLDescribeCol. SQLDescribeCol gibt einen festen Satz von Deskriptorinformationen basierend auf ANSI-89 SQL zurück. SQLColAttribute ermöglicht den Zugriff auf die umfangreicheren Deskriptorinformationen, die in ANSI SQL-92- und DBMS-Anbietererweiterungen verfügbar sind.

Informationen über Finden Sie unter
Binden eines Puffers an eine Spalte in einem Resultset SQLBindCol-Funktion
Abbrechen der Anweisungsverarbeitung SQLCancel-Funktion
Zurückgeben von Informationen zu einer Spalte in einem Resultset SQLDescribeCol-Funktion
Abrufen eines Datenblocks oder Scrollen durch ein Resultset SQLFetchScroll-Funktion
Abrufen mehrerer Datenzeilen SQLFetch-Funktion

Beispiel

Der folgende Beispielcode gibt keine Handles und Verbindungen frei. Codebeispiele zum Freigeben von Handles und Anweisungen finden Sie unter SQLFreeHandle-Funktion, Beispiel-ODBC-Programm und SQLFreeStmt-Funktion .

// 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);  
}  

Weitere Informationen

ODBC-API-Referenz
ODBC-Headerdateien
ODBC-Beispielprogramm