sqlite3 insert problem



  • Hi Leute, habe versucht variablen in den values abschnitt der insert abfrage reinzumachen, ohne erflog!!
    geht das in c++ überhaupt, da ich ne menge erfahrung in php habe, weiß ich, das es dort geht, bin aber in c++ ein naja, fast neuling *g*.

    Hier mal mein nicht fertiger code , das andre ist noch am am arbeiten, aber zumindest müsste case 1 funktionieren, weiß aber eben nich wie ich das hinbekommen soll!!

    #include <iostream>
    #include <string>
    #include <sqlite3.h>
    
    using namespace std;
    
      int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
    cout<< *argv <<endl; // Gibt die Einträge aus
    
    return 0;
    }
    
     int main()
     {
         int menu;
    
     while (menu != 4)
     { 
    
         //Menüaufbau
         cout <<"Was willst du machen?\n";
         cout <<"1 = Daten speichern\n";
         cout <<"2 = Daten lesen\n";
         cout <<"3 = Daten loeschen\n";
         cout <<"4 = Beenden\n";
    
         //Eingabe abfragen
         cout << "Auswahl: ";
         cin >> menu;
    
         //Verzweigung
    		switch (menu)
    		{
    			// Daten speichern
    			case (1):
    			{
                     //char datname;
                        // Als erstes legen wir einen sqlite3-Zeiger an
                           sqlite3* Db;
                           //Dateiname Festlegen
                     //cout <<"Name der Datei:\n";
                     //cin >> datname;
    
                      // und instantiieren ein Objekt von string auf dem Stack
                              string Path = "C:/Saves/test.save";
    
          if(sqlite3_open(Path.c_str(), &Db) != SQLITE_OK)
       {
          // Es ist ein Fehler aufgetreten!
          cout << "Fehler beim Öffnen: " << sqlite3_errmsg(Db) << endl;
    
          // Programm beenden
          return 1;
       }
          // Es hat alles geklappt, die Datenbank wurde geöffnet
       cout << "Datenbank erfolgreich geöffnet!" << endl;
       cin.get();
    
       cout <<"Bitte geben Sie nun ihre Daten ein " <<endl;
       char name[50];
       cout <<"Name: ";
       cin.get (name,49);
       cin.get();
    
       char klasse[50];
       cout <<"Klasse ";
       cin.get (klasse,49);
       cin.get();
    
       char telenummer[50];
       cout <<"Telefonnummer: ";
       cin.get (telenummer,49);
       cin.get();
    
       cout <<"Das sind Ihre Daten: \n";
       cout << name << endl;
       cout << klasse << endl;
       cout << telenummer << endl;
       cin.get();
    
        sqlite3_exec(Db , "create table daten (klasse text, name text, telenummer text); " , Callback , NULL , NULL);
        sqlite3_exec(Db , "insert into daten (klasse,name,telenummer) values ('" << klasse <<"','" << name <<"','" << telenummer <<"'); " , Callback , NULL , NULL);
               			} 
                           break;
    
                  default:
                  {
                     cout <<"Falsche Eingabe";
                     }
                  }
       }
    
    	cout << "Bis zum nächsten Mal" << endl;
        cin.get();
    	return 0;
    }
    

    fehler spucht mein dev-c++ folgendes aus:

    Zeile 83 K:\Dev-Cpp\Projekte ; Quelldateien\tests\main2.cpp invalid operands of types `const char[53]' and `char[50]' to binary `operator<<'

    Hoffe ihr könnt mir helfen!!
    ach ja, wie gesagt hab ich dev c++ und als betriebssystem habsch win vista ultimate...



  • Du musst den string zuerst mal zusammenbauen und dann übergeben.

    sqlite3_exec(Db , "insert into daten (klasse,name,telenummer) values ('" << klasse <<"','" << name <<"','" << telenummer <<"'); " , Callback , NULL , NULL);
    

    Wird zu:

    std::string str;
    str << "insert into daten (klasse,name,telenummer) values ('" << klasse <<"','" << name <<"','" << telenummer <<"'); ";
    sqlite3_exec(Db ,str.c_str ()  , Callback , NULL , NULL);
    


  • Bevor ich erst ma iwas anderes durchlese:

    erstell mal für die verschiedenen cases funktionen - das würde es ein wenig übersichtlich machen, als so nen switch-block über 100de Zeilen...

    dev-c++ ist veraltet und wird nicht mehr weiterentwickelt... entweder du nutzt code::blocks (ist der nachfolger) oder msvc (würde ich dir ja empfehlen aber ich kenn code::blocks auch nicht)

    bb



  • hi,
    @drakon
    irgendwie will das codestück nich funktionieren, wenn ich das mit den variablen mache!!, hier mal `n ausschnitt wies jetzt bei mir aussieht.

    string str = "insert into daten (klasse,name,telenummer)values 
    ('" <<klasse<< "','"<< name <<"','"<< telenummer <<"'); ";
    sqlite3_exec(Db ,str.c_str ()  , Callback , NULL , NULL);
    

    Das geht eindfach nich! Wenn ichs aber so mache, mit normalen wörtern:

    string str = "insert into daten (klasse,name,telenummer)values ('Klasse','Name','Telenummer'); ";
    sqlite3_exec(Db ,str.c_str ()  , Callback , NULL , NULL);
    

    dann gehts, als fehler spuckt mir dev das hier aus:

    Zeile 84 K:\Dev-Cpp\Projekte ; Quelldateien\tests\main2.cpp invalid operands of types `const char[53]' and `char[50]' to binary `operator<<'

    ach noch ne frage, was hat das mit dem std:: aufsich, kenns zwar, wußte aber immer nich, was es bedeutet (weil ich bei meinn strings das nich brauche, i.wie)

    selbst wenn ich haargenau den code von dir nehme, kommt der fehler(nun ja, en bissl anders sieht dann so aus:

    Zeile 85 K:\Dev-Cpp\Projekte ; Quelldateien\tests\main2.cpp no match for 'operator<<' in 'str << "insert into daten (klasse,name,telenummer) values (\'"'

    @unskilled
    nunja, ich bin son typ, der erst den code schreibt, und wenn er funtioniert in funktionen packt, nunja,...habs mir so angewöhnt xD

    kann es sein, dass es an dev-cpp liegt, oder am code? - wenns am dev lieg,t iss kein problem, für nich code::blocks zu nehmen, oder i.was andres(komm aber bei dev sehr gut zurecht).



  • Ich habs nicht getestet. Kein Wunder, dass es nicht geht. Das ist ein string und kein stringstream. 😉

    #include <sstream>
    
    ...
    
    std::stringstream str;
    str <<  "insert into daten (klasse,name,telenummer)values
    ('" <<klasse<< "','"<< name <<"','"<< telenummer <<"'); ";
    sqlite3_exec(Db ,str.str ().c_str ()  , Callback , NULL , NULL);
    

    Immernoch ungetestet, sollte aber gehen. 😉

    Das mit dem std:: bedeutet, dass sich string im Namensbereich std liegt. (Stichwort namespace)

    Du kannst den Namensbereich auch bekannt machen für die aktuelle Übersetzungseinheit,was du ach gemacht hast:

    using namespace std;
    

    Das bedeutet einfach, dass du jetzt den Namensbereich std benutzt und den expliziten Auflöser :: nicht brauchst.

    Ich würde dir auch empfehlen so schnell, wie möglich auf Code::Blocks, oder MSVC++ umzusteigen, weil tatsächlich gewisse Sachen mit alten Compiler nicht richtig funktionieren. (Templates).



  • thx, es geht!!
    okay, dann werd ich wohl dann demnächst von dev-cpp verabschieden, werd mich noch entscheiden was ich nehm, dann ...bye bye dev-cpp *g*

    nochmals danke für die hilfe, ich glaub, ich wär da niemals druf gekommen



  • warum nimmst du eigtl überhaupt nen stringstream und nicht nur nen string? Oo

    also const std::string query ("INSERT INTO " + tabelle + " ...");

    Ich wüsste nicht, welchen Vorteil ein stringstream dort hat... Ist weder schneller noch komfortabler - würde ich zumindest sagen!?

    bb



  • unskilled schrieb:

    warum nimmst du eigtl überhaupt nen stringstream und nicht nur nen string? Oo

    Weil ich dort nicht den ganzen string anpssen musste. 😉 - Sonst hätte ich ja alles ändern müssen. So hatte ich nur std::stringstream und einmal .cstr() hinzufügen müssen. 😃
    Spielt eigl. keine Rolle. Kann man nehmen, was einem besser passt. 😉


Anmelden zum Antworten