SQLite UPDATE Daten (gelöst)



  • Hallo,

    ich möchte die Daten einer bestimmten Datenzeile ändern.
    Dazu suche ich das entsprechende query-Kommando unter C++.
    Das query-Kommando für eine Spalte funktioniert:

    strm << "UPDATE KUNDE SET SCHULD=" << schuld << " WHERE ID=" << kdnr;
    

    Das query-Kommando für alle Spalten funktioniert nicht:

    strm << "UPDATE BESTELL SET KDNAME,ARTNR,ARTBEZ,ARTANZ,ARTPREIS,GESAMT,SCHULD"  << "'" << kdname << "'," << artnr << ",'" << artbez << "'," << artanz << "," << artpreis << "," << gesamtpreis << "," << kdschuld << " WHERE ID=" << kdnr;
    

    MfG

    Juergen B.
    😕



  • Schau dir mal die Syntax für UPDATE genau an (du mußt die Spalten einzeln zuweisen).

    PS: Benutze besser "prepared statements", da dies einfacher zu benutzen ist (und du damit auch z.B. SQL-Injection vermeidest).



  • Hallo,

    so funktioniert das Update:

    int updateOrderData(int bestellnr, int kdnr, string kdname, int artnr, string artbez, int kdanz, float artpreis, float gesamtpreis, float kdschuld)
    {
    	std::stringstream strm;
    	strm << "UPDATE BESTELL SET BESTELLNR=" << bestellnr << "," << "ARTNR=" << artnr << "," << "ARTBEZ=" << "'" << artbez << "'," \ 
                 << "ARTANZ=" << kdanz << "," << "ARTPREIS=" << artpreis << "," << "SCHULD=" << kdschuld << "," << "GESAMT=" << gesamtpreis << " WHERE ID=" << kdnr;
    	string s = strm.str();
    	char *str = &s[0];
    	cout << "query" << str << endl;
    	sqlite3_stmt *statement;
    	int result = 0;
    	const char *query = str;
    	if (sqlite3_prepare(orderfile, query, strlen(query), &statement, 0) == SQLITE_OK)
    	{
    	    int res = sqlite3_step(statement);
    		result = res;
    		sqlite3_finalize(statement);
    	}
    	return result;
    
    }
    

    MfG

    Juergen B.
    😋



  • Statt

    char *str = &s[0];
    
    const char *query = str;
    
    ... query, strlen(query), ...
    

    nimm besser

    sqlite3_prepare(orderfile, s.c_str(), s.size(), &statement, 0)
    


  • Hallo,

    danke für den letzten Hinweis, habe ich verwendet.

    MfG

    Juergen B.



  • Schau dir mal SQL Injection an. Und prepared statements mit Platzhaltern, die das Problem löst.