MySQL, DB Row in String umwandeln
-
Hallo,
irgendwie hänge ich hier gerade an ner sicher sehr einfachen Sache fest und komme nicht so richtig weiter. Ich hoffe mir kann jemand mal Helfen. Folgendes Problem:
(Linux g++)
Ich mache eine MySQL Abfrage und bekomme dann die Ergebnisse von mysql_fetch_row in der Variable dbRow. Nun kann ich die ganz einfach perprintf("%s ", dbRow[i]);ausgeben. Brauche den Wert aber in einem String.
string buffer; ... buffer = dbRow[i];erzeugt "Segmentation fault"
wenn ich den dbRow in ein char* umwandeln will
char buffer(255); sprintf(buffer, "%c", dbRow[3]);erscheint folgernder Fehler:
MySQL.hpp: In member function âint MySQLConnectDB::FlagCheck(MYSQL*, std::string, std::string, std::string, std::string, std::string)â: MySQL.hpp:346: error: invalid conversion from âcharâ to âchar*â MySQL.hpp:346: error: initializing argument 1 of âint sprintf(char*, const char*, ...)âwas mache ich Falsch???
Vielen Dank!
MYSQL_RES * dbResult; MYSQL_ROW dbRow; ... fieldNumbers = mysql_num_fields(dbResult); dbRow = mysql_fetch_row(dbResult); printf("%s ", zeile[i]);
-
Erst einmal wäre es sprintf(buffer, "%s", ...) und nicht "%c".
Zweitens: Welchen Typ hat dbRow?
-
Hallo,
Das Problem an MYSQL_ROW ist, es ist kein nullterminierter String (kann aber sein). Deswegen muß man die schließende 0 noch anfügen. Das könnte man z.Bsp. so machen (ungetestet).
char* buffer; MYSQL_ROW row; unsigned long* lengths; std::string res; row = mysql_fetch_row (result); lengths = mysql_fetch_lengths (result); if (lengths[0] != 0) { buffer = new char[lengths[0]+1]; strncpy (buffer, row[0], lengths[0]); buffer[lengths[0]] = `\0'; res = buffer; delete[] buffer; }
-
Ich hab nochmal ein wenig getestet und das Problem ist folgendes:
das zuweisen in ein char geht:
MYSQL_RES * dbResult; MYSQL_ROW dbRow; char buffer[255]; ... fieldNumbers = mysql_num_fields(dbResult); dbRow = mysql_fetch_row(dbResult); sprintf(buffer, "%s", dbRow[3]);Nun kommt aber das Problem "Segmentation fault" und zwar immer bei der Zeile sprintf(buffer, "%s", dbRow[3]); wenn das auszulesene Feld Null ist.
Jetzt müsste ich das irgendwie abfangen.
In vielen Beispielen wird das mit
if (dbRow[i]==0) {abgefangen. Funktioniert aber auch nicht, da der "Segmentation fault" dann an der if abfrage schon erscheint. Weis echt net wie ich das machen soll.
-
1. Es ist nicht "char", sondern ein Char-Array. Ein gewaltiger Unterschied.
2. Wenn er bei der If-Abfrage scheitert, dann wohl deswegen weil:
a) dbRow 0 ist, oder
b) dbRow[i] außerhalb der Grenze liegt i also zu groß oder zu klein (<0) ist.
-
Danke nochmal für die Antworten.
Also dbRow ist schon ein string habe ich gerade festgestellt.. das eigentliche Problem, ist der Null-Wert aus der Datenbank. Sobald Null aus der DB kommt und ich versuche irgendwie auf den String dbRow zuzugreifen erscheint die Meldung "Segmentation fault".
Wie kann ich das abfangen? wenn selbst bei if (dbRow[i]==0) "Segmentation fault" erscheint?
-
zu 1. ja hast recht sorry Char-Array
2. b) hab ich ausgeschlossen da das Char-Array so aussehen würdedbRow[0] = "Wert1"
dbRow[1] = "Wert2"
dbRow[2] = Null
dbRow[3] = "Wert3"nun bleibt er bei dbRow[2] hängen. Wie kann ich das abfangen?
-
Wenn (dbRow[2] == 0) zu einem Absturz führt, stimmt da was anderes nicht. Was sagt denn der Debugger?
-
char **row = mysql_fetch_row (result); string rowasstring (""); //alternativ auch vector <string> rows; und rows.pushback (row[i]); dann brauchste aber nen else - weil sonst is bissl schwer zu sagen, ob das erste element jz wirklich das erste ist oder das zweite und das erste NULL war ^^ if (row[i]) //könntest auch schreiben: 'if (row[i][0])' macht meines Wissens keinen Unterschied... i hab ich einfach mal so genommen ^^ { rowaasstring = row[i]; } //wenn nicht, dann ist der string eben leer...bb