none
vector push_back überschreibt alle vorgänger RRS feed

  • 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;
    }

    Mittwoch, 29. Oktober 2014 14:08

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

    Mittwoch, 29. Oktober 2014 14:57

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

    Mittwoch, 29. Oktober 2014 14:57
  • Jap daran lag das Problem das ich nur den Zeiger speicher ^^ sry manchmal sieht man den Wald vor lauter Bäumen nicht und verzapft soetwas =) Danke für den Hinweis 
    Mittwoch, 29. Oktober 2014 15:19