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 dieser Funktion zuordnet, wenn ein ODBC 3 ist.x-Anwendung arbeitet mit einem ODBC 2.x-Treiber finden Sie unter Mapping Replacement Functions for Backward Compatibility of Applications.
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, beginnend bei 1. 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. Mit diesem Handle wird definiert, welches Feld in der IRD abgefragt werden soll (z. B. SQL_COLUMN_TABLE_NAME).
CharacterAttributePtr
[Ausgabe] Zeigen Sie auf einen Puffer, in dem der Wert im Feld "FieldIdentifier " der Zeile "ColumnNumber " der IRD zurückgegeben wird, wenn das Feld eine Zeichenfolge ist. Andernfalls wird das Feld nicht verwendet.
Wenn CharacterAttributePtr NULL ist, gibt StringLengthPtr weiterhin die Gesamtanzahl der Bytes zurück (mit Ausnahme des Nullendpunkts für Zeichendaten), die für die Rückgabe im Puffer verfügbar sind, auf den CharacterAttributePtr verweist.
BufferLength
[Eingabe] Wenn FieldIdentifier ein ODBC-definiertes Feld ist und CharacterAttributePtr auf eine Zeichenfolge oder einen binären Puffer zeigt, sollte dieses Argument die Länge von *CharacterAttributePtr sein. Wenn FieldIdentifier ein ODBC-definiertes Feld ist und *CharacterAttributePtr eine ganze Zahl ist, wird dieses Feld ignoriert. Wenn * CharacterAttributePtr eine Unicode-Zeichenfolge ist (beim Aufrufen von SQLColAttributeW), muss das Argument BufferLength eine gerade Zahl sein. Wenn FieldIdentifier ein treiberdefiniertes Feld ist, gibt die Anwendung die Art des Felds an den Treiber-Manager an, indem das Argument BufferLength festgelegt wird. BufferLength kann die folgenden Werte haben:
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(länge) in BufferLength. Dadurch wird ein negativer Wert in BufferLength platziert.
Wenn CharacterAttributePtr ein Zeiger auf einen Datentyp mit fester Länge ist, muss BufferLength eine 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 Gesamtanzahl der Bytes zurückgegeben werden soll (mit Ausnahme des Bytes der Nullendung für Zeichendaten), die in *CharacterAttributePtr zurückgegeben werden können.
Wenn die Anzahl der zurückzugebenden Bytes größer oder gleich BufferLength ist, werden die Deskriptorinformationen in *CharacterAttributePtr abgeschnitten, um PufferLength minus der Länge eines Null-Beendigungszeichens abzubrechen und vom Treiber null beendet zu werden.
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] Zeigen Sie auf einen ganzzahligen Puffer, in dem der Wert im Feld "FieldIdentifier " der Zeile "ColumnNumber " der IRD zurückgegeben wird, 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 der höheren Reihenfolge unverändert lassen. Daher sollten Anwendungen den Wert vor dem Aufrufen dieser Funktion auf 0 initialisieren.
Gibt zurück
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR oder SQL_INVALID_HANDLE.
Diagnostik
Wenn SQLColAttribute entweder SQL_ERROR oder SQL_SUCCESS_WITH_INFO zurückgibt, kann ein zugeordneter SQLSTATE-Wert durch Aufrufen von SQLGetDiagRec mit einem HandleType von SQL_HANDLE_STMT und einem Handle of StatementHandle abgerufen werden. In der folgenden Tabelle sind die SQLSTATE-Werte aufgeführt, die häufig von SQLColAttribute zurückgegeben werden, und jede wird 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 | Error | Beschreibung |
---|---|---|
01000 | Allgemeiner Warnhinweis | 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 nicht eindeutigen Zeichenfolgenwerts wird in *StringLengthPtr zurückgegeben. (Funktion gibt SQL_SUCCESS_WITH_INFO zurück.) |
07005 | Prepared-Anweisung keine Cursorspezifikation | Die dem StatementHandle zugeordnete Anweisung hat kein Resultset zurückgegeben, und FieldIdentifier wurde nicht SQL_DESC_COUNT. Es gab keine Zu beschreibenden Spalten. |
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 | Speicherzuweisungsfehler | Der Treiber konnte speicher nicht zuordnen, der erforderlich ist, um die Ausführung oder den Abschluss der Funktion zu unterstützen. |
HY008 | Vorgang abgebrochen | Die asynchrone Verarbeitung wurde für " StatementHandle" aktiviert. Die Funktion wurde aufgerufen, und bevor sie die Ausführung abgeschlossen hat, wurde SQLCancel oder SQLCancelHandle für die Anweisungshandle aufgerufen. Anschließend wurde die Funktion erneut für " StatementHandle" aufgerufen. Die Funktion wurde aufgerufen, und bevor sie die Ausführung abgeschlossen hat, wurde SQLCancel oder SQLCancelHandle für das StatementHandle von einem anderen Thread in einer Multithreadanwendung aufgerufen. |
HY010 | Funktionssequenzfehler | (DM) Eine asynchron ausgeführte Funktion wurde für den Verbindungshandle aufgerufen, der 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 das 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 ausführungsparametern oder -spalten gesendet wurden. |
HY013 | Speicherverwaltungsfehler | Der Funktionsaufruf konnte nicht verarbeitet werden, da auf die zugrunde liegenden Speicherobjekte nicht zugegriffen werden konnte, möglicherweise aufgrund geringer 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 keine der definierten Werte und kein implementierungsdefinierter Wert. |
HY117 | Die Verbindung wird aufgrund des unbekannten Transaktionsstatus angehalten. Es sind nur Trenn- und schreibgeschützte Funktionen zulässig. | (DM) Weitere Informationen zum angehaltenen Zustand finden Sie unter SQLEndTran Function. |
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 geantwortet hat. Der Verbindungstimeoutzeitraum wird über SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT festgelegt. |
IM001 | Dieser Treiber unterstützt diese Funktion nicht. | (DM) Der dem StatementHandle zugeordnete Treiber unterstützt die Funktion nicht. |
IM017 | Die Abrufung ist im asynchronen Benachrichtigungsmodus deaktiviert. | Immer wenn das Benachrichtigungsmodell verwendet wird, ist die Abrufung 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 Nachbearbeitung durchzuführen und den Vorgang abzuschließen. |
Wenn sqlPrepare und vor SQLExecute aufgerufen werden, 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 der 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 Resultset-Metadaten.
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 der IRD zurück. Die Funktion wird mit einem Anweisungshandle anstelle eines Deskriptorhandles 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 aktuell 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 Beschreibungstypen können von Treibern definiert werden, um die Vorteile verschiedener Datenquellen zu nutzen.
ODBC 3.x-Treiber muss für jedes der Deskriptorfelder einen Wert 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.
Abwärtskompatibilität
ODBC 3.Die x-Funktion SQLColAttribute ersetzt das veraltete ODBC 2.x-Funktion SQLColAttributes. Beim Zuordnen von SQLColAttributes zu SQLColAttribute (wenn odbc 2.x-Anwendung arbeitet mit einem ODBC 3.x-Treiber) oder Zuordnen von SQLColAttribute zu SQLColAttributes (wenn odbc 3.x-Anwendung arbeitet mit einem ODBC 2.x-Treiber), der Treiber-Manager übergibt entweder den Wert von FieldIdentifier, ordnet ihn einem neuen Wert zu oder gibt einen Fehler wie folgt zurück:
Hinweis
Das Präfix, das in FieldIdentifier-Werten in ODBC 3 verwendet wird.x wurde von der 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."x FieldIdentifier " ist identisch mit dem #define Wert von ODBC 3.x FieldIdentifier, der Wert im Funktionsaufruf wird gerade übergeben.
Die #define Werte von ODBC 2.x FieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION und SQL_COLUMN_SCALE unterscheiden sich von den #define Werten von ODBC 3.x FieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE und SQL_DESC_LENGTH. ODBC 2.x-Treiber benötigen nur Unterstützung für ODBC 2.x-Werte . ODBC 3.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", "Dezimalziffern", "Oktettlänge übertragen" und "Anzeigegröße".
Wenn der #define Wert von ODBC 2.x FieldIdentifier unterscheidet sich vom #define Wert des ODBC 3.x FieldIdentifier, wie bei den WERTEN ANZAHL, 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 die in ODBC 2 kein entsprechender Wert vorhanden war.x, es wird nicht zugeordnet, wenn ein ODBC 3.x-Anwendung verwendet sie in einem Aufruf von SQLColAttribute in einem 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 lautet SQLLEN *.
FieldIdentifier | Informationen zurückgegeben in |
Beschreibung |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, wenn es sich bei der Spalte um eine automatisch erhöhende Spalte handelt. SQL_FALSE, wenn es sich bei der Spalte nicht um eine autoinkrementierende Spalte oder nicht um eine numerische Spalte handelt. Dieses Feld ist nur für numerische Datentypspalten gültig. Eine Anwendung kann Werte in eine Zeile einfügen, die eine Autoinkrementierungsspalte enthält, aber in der Regel keine Werte in der Spalte aktualisieren. Wenn ein Einfügen in eine Autoinkrementierungsspalte erstellt wird, wird ein eindeutiger Wert zur Einfügezeit in die Spalte eingefügt. Das Inkrement ist nicht definiert, sondern datenquellenspezifisch. Eine Anwendung sollte nicht davon ausgehen, dass eine Autoinkrementierungsspalte an einem bestimmten Punkt oder Inkrement mit einem bestimmten Wert beginnt. |
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) | CharacterAttributePtr | Der Basisspaltename 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 der 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 Basistabellenname nicht definiert werden kann oder nicht anwendbar ist, enthält diese Variable eine leere Zeichenfolge. Diese Informationen werden aus dem SQL_DESC_BASE_TABLE_NAME Datensatzfeld der IRD zurückgegeben, bei dem es sich um ein schreibgeschütztes Feld handelt. |
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, wenn die Spalte bei Sortierungen und Vergleichen als Groß-/Kleinschreibung behandelt wird. SQL_FALSE, wenn die Spalte bei Sortierungen und Vergleichen nicht als Groß-/Kleinschreibung behandelt wird oder nicht als Character 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 die Spalte Teil einer Ansicht ist. Wenn die Datenquelle Kataloge nicht 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ägnanten Datentyp zurück. beispielsweise SQL_TYPE_TIME oder SQL_INTERVAL_YEAR. (Weitere Informationen finden Sie unter Datentypbezeichner und Beschreibungen in Anhang D: Datentypen.) Diese Informationen werden aus dem SQL_DESC_CONCISE_TYPE Datensatzfeld der IRD zurückgegeben. |
SQL_DESC_COUNT (ODBC 1.0) | NumericAttributePtr | Die Anzahl der spalten, die im Resultset verfügbar sind. Dies gibt 0 zurück, wenn keine Spalten im Resultset vorhanden sind. Der Wert im Argument ColumnNumber wird ignoriert. Diese Informationen werden aus dem SQL_DESC_COUNT Kopfzeilenfeld der 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, Dezimalziffern, Übertragen der 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 nichtzerospezifische Skalierung aufweist. SQL_FALSE, wenn für die Spalte keine feste Genauigkeit und eine nicht zerospezifische Skalierung vorhanden sind. |
SQL_DESC_LABEL (ODBC 2.0) | CharacterAttributePtr | Die Spaltenbeschriftung oder der Titel. Eine Spalte mit dem Namen "EmpName" kann z. B. "Mitarbeitername" oder mit einem Alias beschriftet werden. Wenn eine Spalte keine Beschriftung aufweist, wird der Spaltenname zurückgegeben. Wenn die Spalte nicht bezeichnet 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 darstellt. Es handelt sich um 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. Der Wert schließt immer das Byte mit nuller Beendigung aus, das die Zeichenfolge endet. Diese Informationen werden aus dem SQL_DESC_LENGTH Datensatzfeld der IRD zurückgegeben. Weitere Informationen zur Länge finden Sie unter Spaltengröße, Dezimalziffern, Übertragen der Oktettlänge und Anzeigegröße in Anhang D: Datentypen. |
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) | CharacterAttributePtr | Dieses VARCHAR(128)-Datensatzfeld enthält das Zeichen oder zeichen, das 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 anwendbar ist. Weitere Informationen finden Sie unter Literalpräfixe und Suffixe. |
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) | CharacterAttributePtr | Dieses VARCHAR(128)-Datensatzfeld enthält das Zeichen oder zeichen, das 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 anwendbar ist. 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 lokalisierten (nativen) Namen 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 ist nur für Anzeigezwecke vorgesehen. Der Zeichensatz der Zeichenfolge ist gebietsschemaabhängig und in der Regel der Standardzeichensatz des Servers. |
SQL_DESC_NAME (ODBC 3.0) | CharacterAttributePtr | Der Spaltenalias, falls zutreffend. Wenn der Spaltenalias nicht angewendet wird, wird der Spaltenname zurückgegeben. In beiden Fällen wird SQL_DESC_UNNAMED auf SQL_NAMED festgelegt. Wenn kein Spaltenname oder ein Spaltenalias vorhanden ist, wird eine leere Zeichenfolge zurückgegeben, und SQL_DESC_UNNAMED auf SQL_UNNAMED festgelegt ist. Diese Informationen werden aus dem SQL_DESC_NAME Datensatzfeld der 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 SQL_DESC_NULLABLE Datensatzfeld der 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 einen Wert von 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 Byte. Bei Zeichen- oder Binärtypen mit variabler Länge ist dies die maximale Länge in Bytes. Dieser Wert enthält nicht den Null-Endator. Diese Informationen werden aus dem SQL_DESC_OCTET_LENGTH Datensatzfeld der IRD zurückgegeben. Weitere Informationen zur Länge finden Sie unter Spaltengröße, Dezimalziffern, Übertragen der 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 entsprechende Genauigkeit angibt. Bei Datentypen SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP und allen Intervalldatentypen, die ein Zeitintervall darstellen, ist der Wert die anwendbare Genauigkeit der Bruchteilsekundenkomponente. Diese Informationen werden aus dem SQL_DESC_PRECISION Datensatzfeld der IRD zurückgegeben. |
SQL_DESC_SCALE (ODBC 3.0) | NumericAttributePtr | Ein numerischer Wert, der die entsprechende Skalierung für einen numerischen Datentyp darstellt. Bei DECIMAL- und NUMERIC-Datentypen ist dies die definierte Skalierung. Sie ist für alle anderen Datentypen nicht definiert. Diese Informationen werden aus dem SCALE-Datensatzfeld der 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 die Spalte Teil einer Ansicht 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 in einer WHERE-Klausel nicht verwendet werden kann. (Dies ist identisch mit dem SQL_UNSEARCHABLE Wert in ODBC 2.x.) SQL_PRED_CHAR, wenn die Spalte in einer WHERE-Klausel verwendet werden kann, jedoch nur mit dem LIKE-Prädikat. (Dies ist identisch mit dem SQL_LIKE_ONLY Wert in ODBC 2.x.) SQL_PRED_BASIC, wenn die Spalte in einer WHERE-Klausel mit allen Vergleichsoperatoren außer LIKE verwendet werden kann. (Dies ist identisch mit dem SQL_EXCEPT_LIKE Wert in ODBC 2.x.) SQL_PRED_SEARCHABLE, wenn die Spalte in einer WHERE-Klausel mit einem beliebigen Vergleichsoperator verwendet werden kann. Spalten vom Typ SQL_LONGVARCHAR und SQL_LONGVARBINARY geben in der Regel 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 die Spalte Teil einer Ansicht 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 Textmarken mit variabler Länge zurückgegeben, und SQL_INTEGER wird für Textmarken 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 Beschreibungen in Anhang D: Datentypen. Diese Informationen werden aus dem SQL_DESC_TYPE Datensatzfeld der IRD zurückgegeben. Hinweis: So arbeiten Sie mit ODBC 2.x-Treiber verwenden Sie stattdessen SQL_DESC_CONCISE_TYPE. |
SQL_DESC_TYPE_NAME (ODBC 1.0) | CharacterAttributePtr | Datenquellenabhängiger Datentypname; Beispiel: "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 SQL_DESC_NAME Feld der 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 SQL_DESC_UNNAMED Datensatzfeld der IRD zurückgegeben. |
SQL_DESC_UNSIGNED (ODBC 1.0) | NumericAttributePtr | SQL_TRUE, wenn die Spalte nicht signiert ist (oder nicht numerisch). 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 Benutzerrechten 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.
Verwandte Funktionen
Weitere Informationen zu | Siehe |
---|---|
Binden eines Puffers an eine Spalte in einem Resultset | SQLBindCol-Funktion |
Abbrechen der Verarbeitung von Anweisungen | 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
Im folgenden Beispielcode werden keine Handles und Verbindungen freigegeben. Codebeispiele für kostenlose 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);
}