Abrufen einer Datenzeile

Zum Abrufen einer Datenzeile ruft eine Anwendung SQLFetch auf. SQLFetch kann mit jeder Art von Cursor aufgerufen werden, verschiebt jedoch nur den Rowsetcursor in eine Vorwärtsrichtung. SQLFetch wechselt den Cursor zur nächsten Zeile und gibt die Daten für alle Spalten zurück, die an Aufrufe von SQLBindCol gebunden waren. Wenn der Cursor das Ende des Resultsets erreicht, gibt SQLFetch SQL_NO_DATA zurück. Beispiele für das Aufrufen von SQLFetch finden Sie unter Verwenden von SQLBindCol.

Genau wie SQLFetch implementiert wird, ist treiberspezifisch, aber das allgemeine Muster ist für den Treiber, die Daten für alle gebundenen Spalten aus der Datenquelle abzurufen, sie entsprechend den Typen der gebundenen Variablen zu konvertieren und die konvertierten Daten in diese Variablen zu platzieren. Wenn der Treiber keine Daten konvertieren kann, gibt SQLFetch einen Fehler zurück. Die Anwendung kann das Abrufen von Zeilen fortsetzen, aber die Daten für die aktuelle Zeile gehen verloren. Was mit den Daten für ungebundene Spalten passiert, hängt vom Treiber ab, aber die meisten Treiber rufen sie entweder ab und heben sie auf Karte oder rufen Sie sie überhaupt nicht ab.

Der Treiber legt auch die Werte aller Längen-/Indikatorpuffer fest, die gebunden wurden. Wenn der Datenwert für eine Spalte NULL ist, legt der Treiber den entsprechenden Längen-/Indikatorpuffer auf SQL_NULL_DATA fest. Wenn der Datenwert nicht NULL ist, legt der Treiber den Längen-/Indikatorpuffer auf die Bytelänge der Daten nach der Konvertierung fest. Wenn diese Länge nicht bestimmt werden kann, wie es manchmal bei langen Daten der Fall ist, die von mehreren Funktionsaufrufen abgerufen werden, legt der Treiber den Längen-/Indikatorpuffer auf SQL_NO_TOTAL fest. Bei Datentypen mit fester Länge, z. B. ganze Zahlen und Datumsstrukturen, ist die Bytelänge die Größe des Datentyps.

Bei Daten mit variabler Länge, z. B. Zeichen- und Binärdaten, überprüft der Treiber die Bytelänge der konvertierten Daten anhand der Bytelänge des puffers, der an die Spalte gebunden ist; die Länge des Puffers wird im Argument BufferLength in SQLBindCol angegeben. Wenn die Bytelänge der konvertierten Daten größer als die Bytelänge des Puffers ist, schneidet der Treiber die Daten ab, die in den Puffer passen, gibt die nicht betrunkte Länge im Längen-/Indikatorpuffer zurück, gibt SQL_SUCCESS_WITH_INFO zurück und platziert SQLSTATE 01004 (Daten abgeschnitten) in der Diagnose. Die einzige Ausnahme ist, wenn eine Textmarke mit variabler Länge abgeschnitten wird, wenn sie von SQLFetch zurückgegeben wird, die SQLSTATE 22001 zurückgibt (Zeichenfolgendaten, rechts abgeschnitten).

Daten mit fester Länge werden nie abgeschnitten, da der Treiber davon ausgeht, dass die Größe des gebundenen Puffers die Größe des Datentyps ist. Datenkürzungen sind in der Regel selten, da die Anwendung in der Regel einen Puffer bindet, der groß genug ist, um den gesamten Datenwert zu halten; sie bestimmt die erforderliche Größe aus den Metadaten. Die Anwendung kann jedoch explizit einen Puffer binden, der zu klein ist. Sie kann beispielsweise die ersten 20 Zeichen einer Teilbeschreibung oder die ersten 100 Zeichen einer langen Textspalte abrufen und anzeigen.

Zeichendaten müssen vom Treiber null beendet werden, bevor sie an die Anwendung zurückgegeben wird, auch wenn sie abgeschnitten wurde. Das Nullendpunktzeichen ist nicht in der zurückgegebenen Bytelänge enthalten, erfordert jedoch Platz im gebundenen Puffer. Angenommen, eine Anwendung verwendet Zeichenfolgen, die aus Zeichendaten im ASCII-Zeichensatz bestehen, ein Treiber hat 50 Zeichen mit Daten zurückzugeben, und der Puffer der Anwendung ist 25 Byte lang. Im Puffer der Anwendung gibt der Treiber die ersten 24 Zeichen gefolgt von einem Null-Beendigungszeichen zurück. Im Längen-/Indikatorpuffer gibt sie eine Bytelänge von 50 zurück.

Die Anwendung kann die Anzahl der Zeilen im Resultset einschränken, indem sie das Attribut SQL_ATTR_MAX_ROWS-Anweisung festlegen, bevor die Anweisung ausgeführt wird, die das Resultset erstellt. Beispielsweise benötigt der Vorschaumodus in einer Anwendung zum Formatieren von Berichten nur genügend Daten, um die erste Seite des Berichts anzuzeigen. Durch das Einschränken der Größe des Resultsets würde ein solches Feature schneller ausgeführt werden. Dieses Anweisungsattribut soll den Netzwerkdatenverkehr reduzieren und wird möglicherweise nicht von allen Treibern unterstützt.