Benutzer mit den meisten Antworten
vector push_back überschreibt alle vorgänger

Frage
-
Hallo
ich lese mit der folgenden Methode Daten aus einer Datenbank über SQLFetch aus und speichere alle Werte in in einen Vector retpuffer mittels push_back. Problem ist das der Vector zwar immer mehr Werte bekommt nur die Werte werden alle mit den aktuellen durchlauf überschrieben und somit stehen in allen Feldern immer der letzte Wert drin.
std::vector<CHAR*> Database::SQLFetchData(SQLCHAR* SQLCMD) { SQLExecDirect(hstmt,SQLCMD,SQL_NTS); while (SQL_SUCCEEDED(SQLFetch(hstmt))) { SQLGetData(hstmt,1,SQL_C_CHAR,retval,255,&cbPuffer); retpuffer.push_back((CHAR*)retval); } return retpuffer; }
Antworten
-
- wo und wie ist denn retpuffer deklariert?
- dein return erzeugt eine kopie dieses puffers und gibt sie zurück. ist das so gewollt?
- wie kommst du darauf, daß jedes push_back vorherige werte überschreibt? hast du die werte mal ausgegeben? wenn ja: wie?
- evt. wäre es sinnvoller, statt den ergebnisvektor in kopie zurückzugeben, den aufrufer einen zielector per referenz übergeben zu lassen:
void Database::SQLFetchData(SQLCHAR* SQLCMD, std::vector<CHAR*>& vecTarget) { SQLExecDirect(hstmt,SQLCMD,SQL_NTS); while (SQL_SUCCEEDED(SQLFetch(hstmt))) { SQLGetData(hstmt,1,SQL_C_CHAR,retval,255,&cbPuffer); vecTarget.push_back((CHAR*)retval); } }
- vermutlich sollte dein vector auch CHAR-Elemente beinhalten und nicht CHAR* - ich nehme an, du willst das gelesene Zeichen speichern und keinen Zeiger darauf. das würde erklären, warum sich anscheinend alle elemente ändern: du speicherst einen zeiger und änderst das, worauf er zeigt
- Als Antwort vorgeschlagen suriel6666 Mittwoch, 29. Oktober 2014 15:20
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 30. Oktober 2014 08:28
Alle Antworten
-
- wo und wie ist denn retpuffer deklariert?
- dein return erzeugt eine kopie dieses puffers und gibt sie zurück. ist das so gewollt?
- wie kommst du darauf, daß jedes push_back vorherige werte überschreibt? hast du die werte mal ausgegeben? wenn ja: wie?
- evt. wäre es sinnvoller, statt den ergebnisvektor in kopie zurückzugeben, den aufrufer einen zielector per referenz übergeben zu lassen:
void Database::SQLFetchData(SQLCHAR* SQLCMD, std::vector<CHAR*>& vecTarget) { SQLExecDirect(hstmt,SQLCMD,SQL_NTS); while (SQL_SUCCEEDED(SQLFetch(hstmt))) { SQLGetData(hstmt,1,SQL_C_CHAR,retval,255,&cbPuffer); vecTarget.push_back((CHAR*)retval); } }
- vermutlich sollte dein vector auch CHAR-Elemente beinhalten und nicht CHAR* - ich nehme an, du willst das gelesene Zeichen speichern und keinen Zeiger darauf. das würde erklären, warum sich anscheinend alle elemente ändern: du speicherst einen zeiger und änderst das, worauf er zeigt
- Als Antwort vorgeschlagen suriel6666 Mittwoch, 29. Oktober 2014 15:20
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 30. Oktober 2014 08:28