int mysql_stmt_fetch(MYSQL_STMT *stmt)
Beschreibung
Die Funktion mysql_stmt_fetch()
liefert die
nächste Zeile der Ergebnismenge und kann nur aufgerufen
werden, während die Ergebnismenge besteht, also nach einem
mysql_stmt_execute()
-Aufruf, der eine
Ergebnismenge produziert, oder nach einem
mysql_stmt_store_result()
-Aufruf, der im
Anschluss an mysql_stmt_execute()
die
gesamte Ergebnismenge puffert.
Die Funktion mysql_stmt_fetch()
liefert
Zeilendaten über alle Spalten der aktuellen Zeilenmenge an
die in mysql_stmt_bind_result()
gebundenen
Puffer. Die Längen werden an den
length
-Zeiger zurückgegeben.
Alle Spalten müssen von der Anwendung gebunden werden, ehe
mysql_stmt_fetch()
aufgerufen werden kann.
Ist ein abgerufener Datenwert NULL
, ist der
*is_null
-Wert der zugehörigen
MYSQL_BIND
-Struktur TRUE (1). Andernfalls
werden die Daten und ihre Länge in die Elemente
*buffer
und *length
zurückgegeben, und zwar basierend auf dem von der Anwendung
angegebenen Puffertyp. Jeder numerische und temporale Typ hat
eine festgelegte Länge, wie in der folgenden Tabelle
angegeben. Die Länge von String-Typen hängt von der Länge
des tatsächlichen Datenwerts ab, wie in
data_length
angegeben.
Typ | Länge |
MYSQL_TYPE_TINY |
1 |
MYSQL_TYPE_SHORT |
2 |
MYSQL_TYPE_LONG |
4 |
MYSQL_TYPE_LONGLONG |
8 |
MYSQL_TYPE_FLOAT |
4 |
MYSQL_TYPE_DOUBLE |
8 |
MYSQL_TYPE_TIME |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_DATE |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_DATETIME |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_STRING |
data_length |
MYSQL_TYPE_BLOB |
data_length |
Rückgabewerte
Rückgabewert | Beschreibung |
0 | Erfolg, die Daten wurden in die Anwendungsdatenpuffer geladen. |
1 | Fehler. Den Fehlercode und die Fehlermeldung erhalten Sie von
mysql_stmt_errno() und
mysql_stmt_error() . |
MYSQL_NO_DATA |
Keine weiteren Zeilen/Daten vorhanden. |
MYSQL_DATA_TRUNCATED |
Daten wurden abgeschnitten. |
MYSQL_DATA_TRUNCATED
-Meldungen werden nur
zurückgegeben, wenn dies mit
mysql_options()
eingestellt wurde. Um bei
einer Rückgabe dieses Werts festzustellen, welche Daten
abgeschnitten wurden, schauen Sie sich die
error
-Bestandteile der
MYSQL_BIND
-Parameterstrukturen an.
Fehler
CR_COMMANDS_OUT_OF_SYNC
Befehle wurden in der falschen Reihenfolge ausgeführt.
CR_OUT_OF_MEMORY
Speicherüberlauf.
CR_SERVER_GONE_ERROR
Der MySQL Server ist nicht mehr verfügbar.
CR_SERVER_LOST
Die Serververbindung brach während der Anfrage ab.
CR_UNKNOWN_ERROR
Ein unbekannter Fehler ist aufgetreten.
CR_UNSUPPORTED_PARAM_TYPE
Der Puffertyp ist MYSQL_TYPE_DATE
,
MYSQL_TYPE_TIME
,
MYSQL_TYPE_DATETIME
oder
MYSQL_TYPE_TIMESTAMP
, aber der Datentyp
ist nicht DATE
,
TIME
, DATETIME
oder
TIMESTAMP
.
Alle anderen Fehler wegen nicht unterstützter
Konvertierungen werden von
mysql_stmt_bind_result()
zurückgegeben.
Beispiel
Das folgende Beispiel zeigt, wie man Daten aus einer Tabelle
mit mysql_stmt_result_metadata()
,
mysql_stmt_bind_result()
und
mysql_stmt_fetch()
abholt. (Es wird
erwartet, dass mit diesem Beispiel die beiden Zeilen abgerufen
werden, die in Abschnitt 24.2.7.10, „mysql_stmt_execute()
“,
eingefügt wurden.) Die Variable mysql
sei
ein gültiger Verbindungs-Handle.
#define STRING_SIZE 50 #define SELECT_SAMPLE "SELECT col1, col2, col3, col4 FROM test_table" MYSQL_STMT *stmt; MYSQL_BIND bind[4]; MYSQL_RES *prepare_meta_result; MYSQL_TIME ts; unsigned long length[4]; int param_count, column_count, row_count; short small_data; int int_data; char str_data[STRING_SIZE]; my_bool is_null[4]; /* SELECT-Anfrage vorbereiten, um Daten aus test_table zu holen*/ stmt = mysql_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE))) { fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } fprintf(stdout, " prepare, SELECT successful\n"); /* Hole Zahl der Parameter aus der Anweisung */ param_count= mysql_stmt_param_count(stmt); fprintf(stdout, " total parameters in SELECT: %d\n", param_count); if (param_count != 0) /* validiere Zahl der Parameter */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); } /* Hole Metainformationen zur Ergebnismenge */ prepare_meta_result = mysql_stmt_result_metadata(stmt); if (!prepare_meta_result) { fprintf(stderr, " mysql_stmt_result_metadata(), returned no meta information\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Hole Gesamtzahl der Spalten in der Anfrage */ column_count= mysql_num_fields(prepare_meta_result); fprintf(stdout, " total columns in SELECT statement: %d\n", column_count); if (column_count != 4) /* Validiere Spaltenzahl*/ { fprintf(stderr, " invalid column count returned by MySQL\n"); exit(0); } /* Führe die SELECT-Anfrage aus */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Binde die Ergebnispuffer für alle 4 Spalten, bevor sie abgeholt werden */ memset(bind, 0, sizeof(bind)); /* INTEGER COLUMN */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= &is_null[0]; bind[0].length= &length[0]; /* STRING COLUMN */ bind[1].buffer_type= MYSQL_TYPE_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= &is_null[1]; bind[1].length= &length[1]; /* SMALLINT COLUMN */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null[2]; bind[2].length= &length[2]; /* TIMESTAMP COLUMN */ bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP; bind[3].buffer= (char *)&ts; bind[3].is_null= &is_null[3]; bind[3].length= &length[3]; /* Binde die Ergebnispuffer */ if (mysql_stmt_bind_result(stmt, bind)) { fprintf(stderr, " mysql_stmt_bind_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Alle Ergebnisse auf dem Client zwischenspeichern */ if (mysql_stmt_store_result(stmt)) { fprintf(stderr, " mysql_stmt_store_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Alle Zeilen abholen */ row_count= 0; fprintf(stdout, "Fetching results ...\n"); while (!mysql_stmt_fetch(stmt)) { row_count++; fprintf(stdout, " row %d\n", row_count); /* Spalte 1 */ fprintf(stdout, " column1 (integer) : "); if (is_null[0]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", int_data, length[0]); /* Spalte 2 */ fprintf(stdout, " column2 (string) : "); if (is_null[1]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %s(%ld)\n", str_data, length[1]); /* Spalte 3 */ fprintf(stdout, " column3 (smallint) : "); if (is_null[2]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", small_data, length[2]); /* Spalte 4 */ fprintf(stdout, " column4 (timestamp): "); if (is_null[3]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, length[3]); fprintf(stdout, "\n"); } /* Abgeholte Zeilen validieren */ fprintf(stdout, " total rows fetched: %d\n", row_count); if (row_count != 2) { fprintf(stderr, " MySQL failed to return all rows\n"); exit(0); } /* Vorbereitete Ergebnismetadaten freigeben */ mysql_free_result(prepare_meta_result); /* Anweisung schließen */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.