Teilen über


SQLGetDiagField-Funktion

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

Zusammenfassung
SQLGetDiagField gibt den aktuellen Wert eines Felds eines Datensatzes der Diagnosedatenstruktur (zugeordnet mit einem angegebenen Handle) zurück, der Fehler-, Warnungs- und Statusinformationen enthält.

Syntax


SQLRETURN SQLGetDiagField(  
     SQLSMALLINT     HandleType,  
     SQLHANDLE       Handle,  
     SQLSMALLINT     RecNumber,  
     SQLSMALLINT     DiagIdentifier,  
     SQLPOINTER      DiagInfoPtr,  
     SQLSMALLINT     BufferLength,  
     SQLSMALLINT *   StringLengthPtr);  

Argumente

HandleType
[Eingabe] Ein Handle-Typbezeichner, der den Typ des Handles beschreibt, für den Diagnosen erforderlich sind. Dies muss eine der folgenden Ressourcen sein:

  • SQL_HANDLE_DBC

  • SQL_HANDLE_DBC_INFO_TOKEN

  • SQL_HANDLE_DESC

  • SQL_HANDLE_ENV

  • SQL_HANDLE_STMT

SQL_HANDLE_DBC_INFO_TOKEN Handle wird nur vom Treiber-Manager und treiber verwendet. Anwendungen sollten diesen Handle-Typ nicht verwenden. Weitere Informationen zu SQL_HANDLE_DBC_INFO_TOKEN finden Sie unter Developing Connection-Pool Awareness in an ODBC Driver.For more information about SQL_HANDLE_DBC_INFO_TOKEN, see Developing Connection-Pool Awareness in an ODBC Driver.

Handle
[Eingabe] Ein Handle für die Diagnosedatenstruktur des durch HandleType angegebenen Typs. Wenn HandleType SQL_HANDLE_ENV ist, kann Handle entweder ein freigegebenes oder ein nicht freigegebenes Umgebungshandle sein.

RecNumber
[Eingabe] Gibt den Statusdatensatz an, aus dem die Anwendung Informationen angibt. Statusdatensätze werden ab 1 nummeriert. Wenn das Argument DiagIdentifier ein Feld des Diagnoseheaders angibt, wird RecNumber ignoriert. Wenn nicht, sollte es mehr als 0 sein.

DiagIdentifier
[Eingabe] Gibt das Feld der Diagnose an, dessen Wert zurückgegeben werden soll. Weitere Informationen finden Sie im Abschnitt "DiagIdentifier Argument" in "Comments".

DiagInfoPtr
[Ausgabe] Zeiger auf einen Puffer, in dem die Diagnoseinformationen zurückgegeben werden sollen. Der Datentyp hängt vom Wert von DiagIdentifier ab. Wenn DiagInfoPtr ein ganzzahliger Typ ist, sollten Anwendungen einen Puffer von SQLULEN verwenden und den Wert vor dem Aufrufen dieser Funktion auf 0 initialisieren, da einige Treiber möglicherweise nur die untere 32-Bit- oder 16-Bit eines Puffers schreiben und das Bit mit höherer Reihenfolge unverändert lassen.

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

BufferLength
[Eingabe] Wenn DiagIdentifier eine von ODBC definierte Diagnose ist und DiagInfoPtr auf eine Zeichenfolge oder einen binären Puffer zeigt, sollte dieses Argument die Länge von *DiagInfoPtr aufweisen. Wenn DiagIdentifier ein von ODBC definiertes Feld und *DiagInfoPtr eine ganze Zahl ist, wird BufferLength ignoriert. Wenn der Wert in *DiagInfoPtr eine Unicode-Zeichenfolge ist (beim Aufrufen von SQLGetDiagFieldW), muss das BufferLength-Argument eine gerade Zahl sein.

Wenn DiagIdentifier ein vom Treiber definiertes Feld ist, gibt die Anwendung dem Treiber-Manager die Art des Felds an, indem das BufferLength-Argument festgelegt wird. BufferLength kann die folgenden Werte aufweisen:

  • Wenn DiagInfoPtr ein Zeiger auf eine Zeichenfolge ist, ist BufferLength die Länge der Zeichenfolge oder SQL_NTS.

  • Wenn DiagInfoPtr 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 DiagInfoPtr ein Zeiger auf einen anderen Wert als eine Zeichenfolge oder binäre Zeichenfolge ist, sollte BufferLength den Wert SQL_IS_POINTER haben.

  • Wenn *DiagInfoPtr einen Datentyp mit fester Länge enthält, ist BufferLength 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 der Anzahl der Bytes, die für das NULL-Terminierungszeichen erforderlich sind) zurückgegeben werden soll, die in *DiagInfoPtr für Zeichendaten zurückgegeben werden können. Wenn die Anzahl der zurückzugebenden Bytes größer oder gleich BufferLength ist, wird der Text in *DiagInfoPtr in BufferLength abzüglich der Länge eines NULL-Terminierungszeichens abgeschnitten.

Gibt zurück

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE oder SQL_NO_DATA.

Diagnose

SQLGetDiagField stellt keine Diagnosedatensätze für sich selbst bereit. Es verwendet die folgenden Rückgabewerte, um das Ergebnis seiner eigenen Ausführung zu melden:

  • SQL_SUCCESS: Die Funktion hat erfolgreich Diagnoseinformationen zurückgegeben.

  • SQL_SUCCESS_WITH_INFO: *DiagInfoPtr war zu klein, um das angeforderte Diagnosefeld zu speichern. Daher wurden die Daten im Diagnosefeld abgeschnitten. Um zu ermitteln, dass ein Abschneiden aufgetreten ist, muss die Anwendung BufferLength mit der tatsächlichen Anzahl der verfügbaren Bytes vergleichen, die in *StringLengthPtr geschrieben wird.

  • SQL_INVALID_HANDLE: Das durch HandleType und Handle angegebene Handle war kein gültiges Handle.

  • SQL_ERROR: Eine der folgenden Aktionen ist aufgetreten:

    • Das Argument DiagIdentifier war keiner der gültigen Werte.

    • Das Argument DiagIdentifier wurde SQL_DIAG_CURSOR_ROW_COUNT, SQL_DIAG_DYNAMIC_FUNCTION, SQL_DIAG_DYNAMIC_FUNCTION_CODE oder SQL_DIAG_ROW_COUNT, aber Handle war kein Anweisungshandle. (Der Treiber-Manager gibt diese Diagnose zurück.)

    • Das RecNumber-Argument war negativ oder 0, wenn DiagIdentifier ein Feld aus einem Diagnosedatensatz anzeigte. RecNumber wird für Headerfelder ignoriert.

    • Der angeforderte Wert war eine Zeichenfolge, und BufferLength war kleiner als 0 (null).

    • Bei Verwendung asynchroner Benachrichtigungen war der asynchrone Vorgang für das Handle nicht abgeschlossen.

  • SQL_NO_DATA: RecNumber war größer als die Anzahl der Diagnosedatensätze, die für das in Handle angegebene Handle vorhanden waren . Die Funktion gibt auch SQL_NO_DATA für alle positiven RecNumber-Werte zurück, wenn keine Diagnosedatensätze für Handle vorhanden sind.

Kommentare

Eine Anwendung ruft in der Regel SQLGetDiagField auf, um eines von drei Zielen zu erreichen:

  1. Zum Abrufen spezifischer Fehler- oder Warnungsinformationen, wenn ein Funktionsaufruf SQL_ERROR oder SQL_SUCCESS_WITH_INFO (oder SQL_NEED_DATA für die Funktion SQLBrowseConnect ) zurückgegeben hat.

  2. Um die Anzahl der Zeilen in der Datenquelle zu bestimmen, die betroffen waren, wenn Einfüge-, Lösch- oder Aktualisierungsvorgänge mit einem Aufruf von SQLExecute, SQLExecDirect, SQLBulkOperations oder SQLSetPos (aus dem SQL_DIAG_ROW_COUNT Headerfeld) ausgeführt wurden, oder um die Anzahl der Zeilen zu bestimmen, die im aktuellen geöffneten Cursor vorhanden sind, wenn der Treiber diese Informationen (aus dem SQL_DIAG_CURSOR_ROW_COUNT Headerfeld) bereitstellen kann.

  3. Um zu bestimmen, welche Funktion durch einen Aufruf von SQLExecDirect oder SQLExecute ausgeführt wurde (aus den Headerfeldern SQL_DIAG_DYNAMIC_FUNCTION und SQL_DIAG_DYNAMIC_FUNCTION_CODE).

Jede ODBC-Funktion kann bei jedem Aufruf 0 oder mehr Diagnosedatensätze posten, sodass eine Anwendung SQLGetDiagField nach jedem ODBC-Funktionsaufruf aufrufen kann. Es gibt keine Beschränkung für die Anzahl von Diagnosedatensätzen, die gleichzeitig gespeichert werden können. SQLGetDiagField ruft nur die Diagnoseinformationen ab, die zuletzt der im Argument Handle angegebenen Diagnosedatenstruktur zugeordnet sind. Wenn die Anwendung eine andere ODBC-Funktion als SQLGetDiagField oder SQLGetDiagRec aufruft, gehen alle Diagnoseinformationen aus einem vorherigen Aufruf mit demselben Handle verloren.

Eine Anwendung kann alle Diagnosedatensätze überprüfen, indem recNumber erhöht wird, solange SQLGetDiagField SQL_SUCCESS zurückgibt. Die Anzahl der Statusdatensätze wird im kopfzeilenfeld SQL_DIAG_NUMBER angegeben. Aufrufe von SQLGetDiagField sind nicht destruktiv für die Header- und Datensatzfelder. Die Anwendung kann SQLGetDiagField später erneut aufrufen, um ein Feld aus einem Datensatz abzurufen, solange in der Zwischenzeit keine andere Funktion als die Diagnosefunktionen aufgerufen wurde, die Datensätze auf demselben Handle veröffentlichen würde.

Eine Anwendung kann SQLGetDiagField aufrufen, um jedes Diagnosefeld jederzeit zurückzugeben, mit Ausnahme von SQL_DIAG_CURSOR_ROW_COUNT oder SQL_DIAG_ROW_COUNT, die SQL_ERROR zurückgeben, wenn Handle kein Anweisungshandle ist. Wenn ein anderes Diagnosefeld nicht definiert ist, gibt der Aufruf von SQLGetDiagField SQL_SUCCESS zurück (sofern keine andere Diagnose gefunden wird), und für das Feld wird ein nicht definierter Wert zurückgegeben.

Weitere Informationen finden Sie unter Verwenden von SQLGetDiagRec und SQLGetDiagField und Implementieren von SQLGetDiagRec und SQLGetDiagField.

Wenn Sie eine andere API als die api aufrufen, die asynchron ausgeführt wird, wird HY010 "Funktionssequenzfehler" generiert. Der Fehlerdatensatz kann jedoch nicht abgerufen werden, bevor der asynchrone Vorgang abgeschlossen ist.

HandleType-Argument

Jedem Handletyp können Diagnoseinformationen zugeordnet sein. Das HandleType-Argument gibt den Handle-Typ von Handle an.

Einige Header- und Datensatzfelder können für Umgebungs-, Verbindungs-, Anweisungs- und Deskriptorhandles nicht zurückgegeben werden. Die Handles, für die kein Feld gilt, werden in den folgenden Abschnitten "Headerfelder" und "Datensatzfelder" angegeben.

Wenn HandleType SQL_HANDLE_ENV ist, kann Handle entweder ein freigegebenes oder nicht freigegebenes Umgebungshandle sein.

Einem Umgebungshandle sollten keine treiberspezifischen Headerdiagnosefelder zugeordnet werden.

Die einzigen Diagnoseheaderfelder, die für ein Deskriptorhandle definiert sind, sind SQL_DIAG_NUMBER und SQL_DIAG_RETURNCODE.

DiagIdentifier-Argument

Dieses Argument gibt den Bezeichner des Felds an, das aus der Diagnosedatenstruktur erforderlich ist. Wenn RecNumber größer oder gleich 1 ist, beschreiben die Daten im Feld die von einer Funktion zurückgegebenen Diagnoseinformationen. Wenn RecNumber 0 ist, befindet sich das Feld im Header der Diagnosedatenstruktur und enthält daher Daten, die sich auf den Funktionsaufruf beziehen, der die Diagnoseinformationen zurückgegeben hat, und nicht die spezifischen Informationen.

Treiber können treiberspezifische Header- und Datensatzfelder in der Diagnosedatenstruktur definieren.

Eine ODBC 3*.x*-Anwendung, die mit einem ODBC 2*.x*-Treiber arbeitet, kann SQLGetDiagField nur mit dem DiagIdentifier-Argument SQL_DIAG_CLASS_ORIGIN, SQL_DIAG_CLASS_SUBCLASS_ORIGIN, SQL_DIAG_CONNECTION_NAME, SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_NUMBER, SQL_DIAG_RETURNCODE, SQL_DIAG_SERVER_NAME oder SQL_DIAG_SQLSTATE aufrufen. Alle anderen Diagnosefelder geben SQL_ERROR zurück.

Headerfelder

Die in der folgenden Tabelle aufgeführten Kopfzeilenfelder können im Argument DiagIdentifier enthalten sein.

DiagIdentifier Rückgabetyp Gibt zurück
SQL_DIAG_CURSOR_ROW_COUNT SQLLEN Dieses Feld enthält die Anzahl der Zeilen im Cursor. Seine Semantik hängt von den SQLGetInfo-Informationstypen SQL_DYNAMIC_CURSOR_ATTRIBUTES2, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2, SQL_KEYSET_CURSOR_ATTRIBUTES2 und SQL_STATIC_CURSOR_ATTRIBUTES2 ab, die angeben, welche Zeilenanzahl für jeden Cursortyp (in den SQL_CA2_CRC_EXACT und SQL_CA2_CRC_APPROXIMATE Bits) verfügbar ist.

Der Inhalt dieses Felds wird nur für Anweisungshandles und erst nach dem Aufruf von SQLExecute, SQLExecDirect oder SQLMoreResults definiert. Der Aufruf von SQLGetDiagField mit einem DiagIdentifier von SQL_DIAG_CURSOR_ROW_COUNT auf einem anderen als einem Anweisungshandle gibt SQL_ERROR zurück.
SQL_DIAG_DYNAMIC_FUNCTION SQLCHAR* Dies ist eine Zeichenfolge, die die SQL-Anweisung beschreibt, die von der zugrunde liegenden Funktion ausgeführt wurde. (Spezifische Werte finden Sie weiter unten in diesem Abschnitt unter Werte der Felder der dynamischen Funktion.) Der Inhalt dieses Felds wird nur für Anweisungshandles und erst nach einem Aufruf von SQLExecute, SQLExecDirect oder SQLMoreResults definiert. Der Aufruf von SQLGetDiagField mit einem DiagIdentifier von SQL_DIAG_DYNAMIC_FUNCTION auf einem anderen als einem Anweisungshandle gibt SQL_ERROR zurück. Der Wert dieses Felds ist vor einem Aufruf von SQLExecute oder SQLExecDirect nicht definiert.
SQL_DIAG_DYNAMIC_FUNCTION_CODE SQLINTEGER Dies ist ein numerischer Code, der die SQL-Anweisung beschreibt, die von der zugrunde liegenden Funktion ausgeführt wurde. (Einen bestimmten Wert finden Sie weiter unten in diesem Abschnitt unter "Werte der dynamischen Funktionsfelder".) Der Inhalt dieses Felds wird nur für Anweisungshandles und erst nach einem Aufruf von SQLExecute, SQLExecDirect oder SQLMoreResults definiert. Der Aufruf von SQLGetDiagField mit einem DiagIdentifier von SQL_DIAG_DYNAMIC_FUNCTION_CODE auf einem anderen als einem Anweisungshandle gibt SQL_ERROR zurück. Der Wert dieses Felds ist vor einem Aufruf von SQLExecute oder SQLExecDirect nicht definiert.
SQL_DIAG_NUMBER SQLINTEGER Die Anzahl der Statusdatensätze, die für das angegebene Handle verfügbar sind.
SQL_DIAG_RETURNCODE SQLRETURN Gibt code zurück, der von der Funktion zurückgegeben wird. Eine Liste der Rückgabecodes finden Sie unter Rückgabecodes. Der Treiber muss keine SQL_DIAG_RETURNCODE implementieren. Sie wird immer vom Treiber-Manager implementiert. Wenn noch keine Funktion für das Handle aufgerufen wurde, wird SQL_SUCCESS für SQL_DIAG_RETURNCODE zurückgegeben.
SQL_DIAG_ROW_COUNT SQLLEN Die Anzahl der Zeilen, die von einem Einfügen, Löschen oder Aktualisieren betroffen sind, das von SQLExecute, SQLExecDirect, SQLBulkOperations oder SQLSetPos ausgeführt wird. Es ist treiberdefiniert, nachdem eine Cursorspezifikation ausgeführt wurde. Der Inhalt dieses Felds wird nur für Anweisungshandles definiert. Der Aufruf von SQLGetDiagField mit einem DiagIdentifier von SQL_DIAG_ROW_COUNT auf einem anderen als einem Anweisungshandle gibt SQL_ERROR zurück. Die Daten in diesem Feld werden auch im RowCountPtr-Argument von SQLRowCount zurückgegeben. Die Daten in diesem Feld werden nach jedem nichtdiagnostischen Funktionsaufruf zurückgesetzt, während die von SQLRowCount zurückgegebene Zeilenanzahl unverändert bleibt, bis die Anweisung auf den vorbereiteten oder zugeordneten Zustand zurückgesetzt wird.

Datensatzfelder

Die in der folgenden Tabelle aufgeführten Datensatzfelder können im Argument DiagIdentifier enthalten sein.

DiagIdentifier Rückgabetyp Gibt zurück
SQL_DIAG_CLASS_ORIGIN SQLCHAR* Eine Zeichenfolge, die das Dokument angibt, das den Klassenteil des SQLSTATE-Werts in diesem Datensatz definiert. Sein Wert ist "ISO 9075" für alle SQLSTATEs, die von der Open Group- und ISO-Aufrufebenenschnittstelle definiert sind. Für ODBC-spezifische SQLSTATEs (alle, deren SQLSTATE-Klasse "CHAT") lautet der Wert "ODBC 3.0".
SQL_DIAG_COLUMN_NUMBER SQLINTEGER Wenn das feld SQL_DIAG_ROW_NUMBER eine gültige Zeilennummer in einem Rowset oder eine Reihe von Parametern ist, enthält dieses Feld den Wert, der die Spaltennummer im Resultset oder die Parameternummer im Parametersatz darstellt. Resultsetspaltennummern beginnen immer bei 1; Wenn sich dieser Statusdatensatz auf eine Lesezeichenspalte bezieht, kann das Feld null sein. Parameternummern beginnen bei 1. Er hat den Wert SQL_NO_COLUMN_NUMBER, wenn der Statusdatensatz keiner Spaltennummer oder Parameternummer zugeordnet ist. Wenn der Treiber die Spalten- oder Parameternummer, mit der dieser Datensatz verknüpft ist, nicht ermitteln kann, weist dieses Feld den Wert SQL_COLUMN_NUMBER_UNKNOWN auf.

Der Inhalt dieses Felds wird nur für Anweisungshandles definiert.
SQL_DIAG_CONNECTION_NAME SQLCHAR* Eine Zeichenfolge, die den Namen der Verbindung angibt, auf die sich der Diagnosedatensatz bezieht. Dieses Feld ist treiberdefiniert. Für Diagnosedatenstrukturen, die dem Umgebungshandle zugeordnet sind, und für Diagnosen, die sich nicht auf eine Verbindung beziehen, ist dieses Feld eine Zeichenfolge der Länge Null.
SQL_DIAG_MESSAGE_TEXT SQLCHAR* Eine Informationsmeldung zu dem Fehler oder der Warnung. Dieses Feld ist wie unter Diagnosemeldungen beschrieben formatiert. Es gibt keine maximale Länge des Diagnosemeldungstexts.
SQL_DIAG_NATIVE SQLINTEGER Ein treiber-/datenquellenspezifischer nativer Fehlercode. Wenn kein systemeigener Fehlercode vorhanden ist, gibt der Treiber 0 zurück.
SQL_DIAG_ROW_NUMBER SQLLEN Dieses Feld enthält die Zeilennummer im Rowset oder die Parameternummer im Parametersatz, dem der Statusdatensatz zugeordnet ist. Zeilennummern und Parameternummern beginnen mit 1. Dieses Feld hat den Wert SQL_NO_ROW_NUMBER, wenn dieser Statusdatensatz keiner Zeilennummer oder Parameternummer zugeordnet ist. Wenn der Treiber die Zeilennummer oder die Parameternummer, mit der dieser Datensatz verknüpft ist, nicht ermitteln kann, weist dieses Feld den Wert SQL_ROW_NUMBER_UNKNOWN auf.

Der Inhalt dieses Felds wird nur für Anweisungshandles definiert.
SQL_DIAG_SERVER_NAME SQLCHAR* Eine Zeichenfolge, die den Servernamen angibt, auf den sich der Diagnosedatensatz bezieht. Er entspricht dem Wert, der für einen Aufruf von SQLGetInfo mit der Option SQL_DATA_SOURCE_NAME zurückgegeben wird. Für Diagnosedatenstrukturen, die dem Umgebungshandle zugeordnet sind, und für Diagnosen, die sich nicht auf einen Server beziehen, ist dieses Feld eine Zeichenfolge der Länge Null.
SQL_DIAG_SQLSTATE SQLCHAR* Ein fünfstellige SQLSTATE-Diagnosecode. Weitere Informationen finden Sie unter SQLSTATEs.
SQL_DIAG_SUBCLASS_ORIGIN SQLCHAR* Eine Zeichenfolge mit demselben Format und gültigen Werten wie SQL_DIAG_CLASS_ORIGIN, die den definierenden Teil des Teils der Unterklasse des SQLSTATE-Codes identifiziert. Die ODBC-spezifischen SQLSTATES, für die "ODBC 3.0" zurückgegeben wird, umfassen Folgendes:

01S00, 01S01, 01S02, 01S06, 01S07, 07S01, 08S01, 21S01, 21S02, 25S01, 25S02, 25S03, 42S01, 42S02, 42S11, 42S12, 42S21, 42S22, HY095, HY097, HY098, HY099, HY100, HY101, HY105, HY107, HY109, HY110, HY111, HYT00, HYT01, IM001, IM002, IM003, IM004, IM005, IM006, IM007, IM008, IM010, IM011, IM012.

Werte der dynamischen Funktionsfelder

In der folgenden Tabelle werden die Werte von SQL_DIAG_DYNAMIC_FUNCTION und SQL_DIAG_DYNAMIC_FUNCTION_CODE beschrieben, die für jeden Sql-Anweisungstyp gelten, der durch einen Aufruf von SQLExecute oder SQLExecDirect ausgeführt wird. Der Treiber kann den aufgeführten treiberdefinierte Werte hinzufügen.

SQL-Anweisung

Ausgeführt
Wert von

SQL_DIAG_DYNAMIC_FUNCTION
Wert von

SQL_DIAG_DYNAMIC_FUNCTION_CODE
alter-domain-statement "ALTER DOMAIN" SQL_DIAG_ALTER_DOMAIN
alter-table-statement "ALTER TABLE" SQL_DIAG_ALTER_TABLE
Assertionsdefinition "ASSERTION ERSTELLEN" SQL_DIAG_CREATE_ASSERTION
Zeichensatzdefinition "ZEICHENSATZ ERSTELLEN" SQL_DIAG_CREATE_CHARACTER_SET
Sortierungsdefinition "SORTIERUNG ERSTELLEN" SQL_DIAG_CREATE_COLLATION
domainn-definition "DOMÄNE ERSTELLEN" SQL_DIAG_CREATE_DOMAIN
create-index-statement "INDEX ERSTELLEN" SQL_DIAG_CREATE_INDEX
create-table-statement "TABELLE ERSTELLEN" SQL_DIAG_CREATE_TABLE
create-view-statement "ANSICHT ERSTELLEN" SQL_DIAG_CREATE_VIEW
Cursorspezifikation "CURSOR AUSWÄHLEN" SQL_DIAG_SELECT_CURSOR
delete-statement-positioned "DYNAMISCHER LÖSCHCURSOR" SQL_DIAG_DYNAMIC_DELETE_CURSOR
delete-statement-searched "WO LÖSCHEN" SQL_DIAG_DELETE_WHERE
drop-assertion-statement "DROP ASSERTION" SQL_DIAG_DROP_ASSERTION
drop-character-set-stmt "ZEICHENSATZ ABLEGEN" SQL_DIAG_DROP_CHARACTER_SET
drop-sortation-statement "DROP-SORTIERUNG" SQL_DIAG_DROP_COLLATION
drop-domain-statement "DROP DOMAIN" SQL_DIAG_DROP_DOMAIN
drop-index-anweisung "DROP INDEX" SQL_DIAG_DROP_INDEX
drop-schema-statement "DROP SCHEMA" SQL_DIAG_DROP_SCHEMA
drop-table-anweisung "DROP TABLE" SQL_DIAG_DROP_TABLE
drop-translation-statement "DROP TRANSLATION" SQL_DIAG_DROP_TRANSLATION
drop-view-statement "DROP VIEW" SQL_DIAG_DROP_VIEW
grantstatement "GRANT" SQL_DIAG_GRANT
insert-anweisung "INSERT" SQL_DIAG_INSERT
ODBC-procedure-extension "ANRUF" anruf SQL_DIAG_
revoke-statement "REVOKE" SQL_DIAG_REVOKE
Schemadefinition "SCHEMA ERSTELLEN" SQL_DIAG_CREATE_SCHEMA
translation-definition "ÜBERSETZUNG ERSTELLEN" SQL_DIAG_CREATE_TRANSLATION
update-statement-positioned "DYNAMISCHER AKTUALISIERUNGSCURSOR" SQL_DIAG_DYNAMIC_UPDATE_CURSOR
update-statement-searched "UPDATE WHERE" SQL_DIAG_UPDATE_WHERE
Unbekannt leere Zeichenfolge SQL_DIAG_UNKNOWN_STATEMENT

Sequenz der Statusdatensätze

Statusdatensätze werden basierend auf der Zeilennummer und dem Typ der Diagnose in einer Sequenz positioniert. Der Treiber-Manager bestimmt die endgültige Reihenfolge, in der statusdatensätze zurückgegeben werden sollen, die er generiert. Der Treiber bestimmt die endgültige Reihenfolge, in der statusdatensätze zurückgegeben werden sollen, die er generiert.

Wenn Diagnosedatensätze sowohl vom Treiber-Manager als auch vom Treiber veröffentlicht werden, ist der Treiber-Manager für die Bestellung verantwortlich.

Wenn zwei oder mehr Statusdatensätze vorhanden sind, wird die Reihenfolge der Datensätze zuerst durch die Zeilennummer bestimmt. Die folgenden Regeln gelten für die Bestimmung der Reihenfolge der Diagnosedatensätze nach Zeile:

  • Datensätze, die keiner Zeile entsprechen, werden vor Datensätzen angezeigt, die einer bestimmten Zeile entsprechen, da SQL_NO_ROW_NUMBER als -1 definiert ist.

  • Datensätze, für die die Zeilennummer unbekannt ist, werden vor allen anderen Datensätzen angezeigt, da SQL_ROW_NUMBER_UNKNOWN als -2 definiert ist.

  • Für alle Datensätze, die sich auf bestimmte Zeilen beziehen, werden Datensätze nach dem Wert im Feld SQL_DIAG_ROW_NUMBER sortiert. Alle Fehler und Warnungen der ersten betroffenen Zeile werden aufgelistet, und dann alle Fehler und Warnungen der nächsten betroffenen Zeile usw.

Hinweis

Der ODBC 3*.x*-Treiber-Manager sortiert keine Statusdatensätze in der Diagnosewarteschlange, wenn SQLSTATE 01S01 (Fehler in Zeile) von einem ODBC 2*.x*-Treiber zurückgegeben wird oder WENN SQLSTATE 01S01 (Fehler in Zeile) von einem ODBC 3*.x*-Treiber zurückgegeben wird, wenn SQLExtendedFetch aufgerufen wird oder SQLSetPos auf einem Cursor aufgerufen wird, der mit SQLExtendedFetch positioniert wurde.

Innerhalb jeder Zeile oder für alle Datensätze, die keiner Zeile entsprechen oder für die die Zeilennummer unbekannt ist, oder für alle Datensätze, deren Zeilennummer SQL_NO_ROW_NUMBER entspricht, wird der erste aufgeführte Datensatz mithilfe einer Reihe von Sortierregeln bestimmt. Nach dem ersten Datensatz ist die Reihenfolge der anderen Datensätze, die sich auf eine Zeile auswirken, nicht definiert. Eine Anwendung kann nicht davon ausgehen, dass Fehler vor Warnungen nach dem ersten Datensatz auftreten. Anwendungen sollten die vollständige Diagnosedatenstruktur überprüfen, um vollständige Informationen zu einem nicht erfolgreichen Aufruf einer Funktion zu erhalten.

Die folgenden Regeln werden verwendet, um den ersten Datensatz innerhalb einer Zeile zu bestimmen. Der Datensatz mit dem höchsten Rang ist der erste Datensatz. Die Quelle eines Datensatzes (Treiber-Manager, Treiber, Gateway usw.) wird beim Rangieren von Datensätzen nicht berücksichtigt.

  • Fehler Statusdatensätze, die Fehler beschreiben, haben den höchsten Rang. Die folgenden Regeln werden auf Sortierfehler angewendet:

    • Datensätze, die auf einen Transaktionsfehler oder einen möglichen Transaktionsfehler hinweisen, überlisten alle anderen Datensätze.

    • Wenn mindestens zwei Datensätze dieselbe Fehlerbedingung beschreiben, übertrumpfen SQLSTATEs, die durch die Open Group CLI-Spezifikation (Klassen 03 bis HZ) definiert sind, ODBC- und treiberdefinierte SQLSTATEs.

  • Implementierungsdefinierte Keine Datenwerte Statusdatensätze, die vom Treiber definierte No Data-Werte (Klasse 02) beschreiben, haben den zweithöchsten Rang.

  • Warnungen Statusdatensätze, die Warnungen beschreiben (Klasse 01), haben den niedrigsten Rang. Wenn zwei oder mehr Datensätze dieselbe Warnungsbedingung beschreiben, übertrumpfen sqlstatEs, die durch die Open Group CLI-Spezifikation definiert werden, odbc- und treiberdefinierte SQLSTATEs.

Informationen über Finden Sie unter
Abrufen mehrerer Felder einer Diagnosedatenstruktur SQLGetDiagRec-Funktion

Weitere Informationen

ODBC-API-Referenz
ODBC-Headerdateien