C++ SQlite bestimmtw Werte suchen und speichern



  • Hallo liebe C++ Community,

    ich habe gerade folgendes Problem:

    Ich habe eine sqlite-Datenbank mit Namen Datenbank_Test, darin eine Tabelle mit Namen Tabelle_1 der folgenden Form:

    ID-1, ID-2, ID-3, ID-4, Id-5, String 1, String 2
    1, 1, 3, 4, 2 , abc, def
    2, 1, 2, 3, 1, bcd, aki
    3, 2, 1, 2, 2, klm, ghi

    Nun möchte ich mit einem in C++ geschriebenen Programm (Compiler Microsoft Visual Studio) auf die Datenbank zugreifen und dann nach ID-1 suchen und die Werte entsprechend abspeichern (BSP: Es wird nach ID-1=2 gesucht, danach haben meine Parameter folgende Werte:
    ID-1=2; ID-2 =1; ID-3=2; ID-4=3; Id-5=1; String 1=bcd, String 2=aki

    Bisher geschehen: elendlanges Suchen durch verschiedene Websites, die sqlite3 lib ist heruntergeladen und funktioniert.
    Der Datenbankaufruf nach https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_SQlite funktioniert auch
    Das sqlite3_exec Beispiel von folgender Website abgeändert funktioniert auch:
    https://stackoverflow.com/questions/31146713/sqlite3-exec-callback-function-clarification
    Hier der Datenbankaufruf von Wikibooks, der ja funktioniert
    #include <iostream>
    #include <string>
    #include <sqlite3.h>

    using namespace std;

    int main()
    {
    // Als erstes legen wir einen sqlite3-Zeiger an
    sqlite3* Database;
    // und instantiieren ein Objekt von string auf dem Stack
    string Path;

    // Danach fragen wir den Benutzer nach dem Pfad zur Datenbankdatei
    cout << "Pfad zur Datenbankdatei: ";
    cin >> Path;

    // Nun können wir die Datenbank öffnen!
    if(sqlite3_open(Path.c_str(), &Database) != SQLITE_OK)
    {
    // Es ist ein Fehler aufgetreten!
    cout << "Fehler beim Öffnen: " << sqlite3_errmsg(Database) << endl;

      // Programm beenden
      return 1;
    

    }

    //Ich nehme mal an hier muss der Code hin also das Statement usw, das ich dann nutze?

    // Es hat alles geklappt, die Datenbank wurde geöffnet
    cout << "Datenbank erfolgreich geöffnet!" << endl;

    // Jetzt können wir die Datenbank wieder schließen
    sqlite3_close(Database);

    cout << "Datenbank geschlossen!" << endl;

    // Programm beenden
    return 0;
    }
    Allerdings habe ich folgende Probleme:
    Ich steige durch die Abfrage an SQLite Banken noch nicht durch, so wie ich verstanden habe muss man erst mal ein Statement vormulieren, in diesem fall ja wahrscheinlich "SELECT * FROM Tabelle_1 WHERE ID-1=2". Dann muss man dieses ausführen lassen und die Werte dabei irgendwie abspeichern und die Anfrage dann beenden. Wie sorge ich dafür dass die Werte danach erhalten bleiben?

    Ist das hier ein Ansatz in die richtige Richtung?
    sqlite3_stmt *stmt;
    const char *sql = "SELECT * FROMTabelle_1 WHERE ID-1=2 ";
    int rc = sqlite3_prepare_v2(Database, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {
    print("error: ", sqlite3_errmsg(Database));
    return;
    }
    while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
    int ID-1 = sqlite3_column_int (stmt, 0);
    int ID-2 = sqlite3_column_int (stmt, 1);
    int ID-3 = sqlite3_column_int (stmt, 2);
    int ID-4 = sqlite3_column_int (stmt, 3);
    int ID-5 = sqlite3_column_int (stmt, 4);
    string a = sqlite3_column_text(stmt, 5);
    string b = sqlite3_column_text(stmt, 6);

    // ...
    

    }
    if (rc != SQLITE_DONE) {
    print("error: ", sqlite3_errmsg(db));
    }
    sqlite3_finalize(stmt);

    So wie ich das gelesen habe werden die Werte aber nach der Abfrage geslöscht, wenn ich mit denen weiterrechenen will wird da auch nur ein fehler angezeigt.
    Mir wäre auch egal wenn die Werte nicht direkt als Integer zurückkommen sondern bspw als string die ich dann per stringstream oder so umwandle. HAuptsache ich kann damit weiterrechnen.

    Ich wäre sehr dankbar wenn jemand helfen könnte, die ganzen Sachen die man in die Sqlitebefehle eingeben muss sind mir oft nicht ganz verständlich.

    Vielen Dank



  • @Sonnentag
    Wie immer der Hinweis darauf doch bitte die Codetags zu nutzen, damit das ganze lesbarer ist. Dann sollte es ein minimales compilierbares Programm sein, so dass man den Fehler besser erfassen kann.



  • @Sonnentag sagte in C++ SQlite bestimmtw Werte suchen und speichern:

    werden die Werte aber nach der Abfrage geslöscht,

    Nein. Variablen die man lokal in einer Schleife anlegt sind aber ausserhalb der Schleife nicht mehr vorhanden. Das hat nichts mit Sqlite zu tun.



  • @manni66 Das heißt ich habe keine Möglichkeit die Werte abzuspeichern und dann weiter zu nutzen so wie es bspw bei CSV Dateien der Fall war?
    Gibt es vlt eine Möglichkeit wie bei csv Dateien einfach Zeilenweise die SQL Datei als String abzuspeichern und den dann weiter zu bearbeiten?


  • Mod

    Wie manni77 schon sagte: Das hat NICHTS mit Sqlite (oder CSV) zu tun!

    Das ist ganz einfach, wie Schleifen funktionieren. Wenn Werte aus Variablen in einer Schleife auch außerhalb dieser Schleife brauchst, dann musst du diese an etwas übergeben, das auch außerhalb dieser Schleife existiert. Das ist ein Basismuster, das du kennen musst und sollte in jedem Programmierkurs ziemlich früh dran kommen.



  • Stichworte: Lebensdauer und Sichtbarkeit von Variablen (lifetime and scope of variables)



  • Falsche Sprache.

    Don't get me wrong. Real programmers might do list processing in fortran, accounting in fortran, ai in fortran. But heck, that was 30 years ago. Wanna do db stuff? Use some state of the art language.


Log in to reply