Suche Datenbanksystem



  • Jaa ja jaa habt ja Recht.
    Das Tut ist echt gut und auch wenns auf englisch ist, gut zu verstehen.

    Ps.
    Hab übriegends ne .db hinbekommen 😃 War ja easy going^^

    Aber ich würde mich freuen, wenn mir jemand kurz auf Deutsch erklärt was es mit der "SQL Master Table" auf sich hat. Das habe ich nicht ganz verstanden:

    Aside: Querying the SQLITE_MASTER table

    The database schema in an SQLite database is stored in a special table named "sqlite_master". You can execute "SELECT" statements against the special sqlite_master table just like any other table in an SQLite database. For example:

    $ sqlite3 ex1
    SQLite vresion 3.6.11
    Enter ".help" for instructions
    sqlite> select * from sqlite_master;
    type = table
    name = tbl1
    tbl_name = tbl1
    rootpage = 3
    sql = create table tbl1(one varchar(10), two smallint)
    sqlite>

    But you cannot execute DROP TABLE, UPDATE, INSERT or DELETE against the sqlite_master table. The sqlite_master table is updated automatically as you create or drop tables and indices from the database. You can not make manual changes to the sqlite_master table.

    The schema for TEMPORARY tables is not stored in the "sqlite_master" table since TEMPORARY tables are not visible to applications other than the application that created the table. The schema for TEMPORARY tables is stored in another special table named "sqlite_temp_master". The "sqlite_temp_master" table is temporary itself.

    Danke



  • Hab grad keine SQLite Db zur Hand, aber die Master Tabelle enthält alle Tabellenschemata der Datenbank. Du kannst auf diese Tabelle nur lesend zugreifen.
    Die Schemata von temporären Tabellen (Views) stehen NICHT in der Master Tabelle und stehen nur der Anwendung zur Verfügung, die sie erzeugt haben (meine Vermutung: liegen komplett im RAM und nicht in der .db Datei). Die Tabellenschemata der temporären Tabellen liegen in der Tabelle sqlite_temp_master.



  • Bist du sicher, dass du überhaupt ein richtiges Datenbanksystem benötigst?
    Für mich klang es so als möchtest Du beim Beenden des Programms Daten in eine Datei schreiben und diese beim Start wieder in den Arbeistspeicher laden.

    Hast du dir mal das weiter vorne verlinkte boost serialization angesehen? Das ist ziemlich simpel. Etwa so

    void save()
    {
      ofstream ofs(...);
      boost::archive::text_oarchive oa(ofs);
      oa << mein_daten_objekt;
    }
    void load()
    {
      ifstream ifs(...);
      boost::archive::text_iarchive ia(ifs);
      ia >> mein_daten_objekt;
    }
    


  • Naja wenn ich z.B. ein kleines Addressbuch schreibe ist so ein Tabellen-Datenbank System schon schöner. Benutze ich bei PHP-Scripten auch immer.

    Ich gehe nun davon aus, dass es nicht so einfach ist, sein kleines c++ Programm einfach mal eben so mit einer .db zu verbinden und die auszulesen?

    ➡ Hätte jetzt eigentlich gedacht ich binde einfach nur ne bestimmte .h ein, benutze eine Funktion(".../mydata.db") und kann die halt mit weiteren funktionen auswerten oder wie bei php direkt SQL Code durch Query oder so benutzen.

    Aber anscheinend ist es bei c++ komplizierter. Hab nach paar Beispiele gegoogelt und da kommen immer seitenlange Quelltexte raus. Schade.

    Bin ich auf den falschen Seiten gelandet oder ist es wirklich so?



  • Es ist schon etwas komplizierter als in PHP, aber seitenlanger Quelltext ist übertrieben. Vermutlich kann dir ein C++ Wrapper einiges an Schreibarbeit abnehmen, bei mir ist das Auslesen einer Tabelle aus einer SQLite3 Datenbank nur ein paar Zeilen lang (und wirklich nur ein paar... um die 10).

    Edit: Benutze den CppSQLite3 Wrapper



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Datenbanken verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • das Auslesen einer Tabelle aus einer SQLite3 Datenbank nur ein paar Zeilen lang (und wirklich nur ein paar... um die 10).

    Ob du so nett wärest und diesen "kleinen" Code mal zeigen könntest. Dann hab ich zumindest einen Anfang.



  • Sicher doch

    SQLite3DB   Database;
    Database.open( "c:/database.db" );
    
    SQLite3Query Query = Database.execQuery( "SELECT * FROM tbl_layout" );
    if( false == Query.eof() )
    {
       Layout->LayoutType              = static_cast<TLayout::LayoutType_t>( Query.getIntField( "type" ) );
       Layout->LayoutName              = Query.getStringField( "name" );
       Layout->MajorVersion            = Query.getIntField( "major_version" );
       Layout->MinorVersion            = Query.getIntField( "minor_version" );
    }
    

    Ist jetzt zwar völlig aus dem Kontext gerissen, aber dürfte etwas helfen. Der Schnipsel liest genau einen Datensatz aus einer Tabelle, wenn du mehrere Datensätze lesen willst musst du halt die if-Klausel durch eine while-Klausel ersetzen und nach Behandlung des aktuellen Datensatzes mit SQLite3Query::nextRow() zum nächsten Datensatz springen:

    SQLite3DB   Database;
    Database.open( "c:/database.db" );
    
    SQLite3Query Query = Database.execQuery( "SELECT * FROM tbl_layout" );
    while( false == Query.eof() )
    {
       // Datensatz behandeln
       ...
       Query.nextRow();
    }
    


  • DocShoe schrieb:

    Sicher doch

    SQLite3DB   Database;
    Database.open( "c:/database.db" );
    
    SQLite3Query Query = Database.execQuery( "SELECT * FROM tbl_layout" );
    if( false == Query.eof() )
    {
       Layout->LayoutType              = static_cast<TLayout::LayoutType_t>( Query.getIntField( "type" ) );
       Layout->LayoutName              = Query.getStringField( "name" );
       Layout->MajorVersion            = Query.getIntField( "major_version" );
       Layout->MinorVersion            = Query.getIntField( "minor_version" );
    }
    

    Ist jetzt zwar völlig aus dem Kontext gerissen, aber dürfte etwas helfen. Der Schnipsel liest genau einen Datensatz aus einer Tabelle, wenn du mehrere Datensätze lesen willst musst du halt die if-Klausel durch eine while-Klausel ersetzen und nach Behandlung des aktuellen Datensatzes mit SQLite3Query::nextRow() zum nächsten Datensatz springen:

    SQLite3DB   Database;
    Database.open( "c:/database.db" );
    
    SQLite3Query Query = Database.execQuery( "SELECT * FROM tbl_layout" );
    while( false == Query.eof() )
    {
       // Datensatz behandeln
       ...
       Query.nextRow();
    }
    

    Cool danke.
    Das sieht doch schonmal gut aus.

    Was für eine lib also .h muss ich fürs SQLDB einbinden?



  • Achja und hast du Database und layout gar nicht deklariert?



  • Klaudii schrieb:

    Achja und hast du Database und layout gar nicht deklariert?

    Oh, jetzt wo du´s sagst fällt´s mir auch auf. Und ich suche seit einigen Monaten den Fehler, warum das Projekt nicht kompiliert.



  • Klaudii: Jetzt mal ganz im Ernst: Lies gefälligst Doku und komm erst dann wieder. Niemand wird Dir hier alles vorkauen, sorry.



  • Die Dokus die ich bisher gegooglet habe, sprengen enorm den Rahmen und sind zu umfangreich.

    Kannst du mir denn ein gutes Tutorials, was sich größteiles nur auf das Connecten + Ein- und Auslesen einer SQLite Datenbank in C++ beschränkt? Wäre super wenns auf deutsch wäre. Kann zwar auch englisch aber in der Muttersprache ist es ja immer ein wenig angenehmer 😛



  • In der Zeit, die Du hier mit Versuchen, andere Leute Deine Arbeit machen zu lassen, verbracht hast, hättest Du schon längst jedes Tutorial durch.

    Ich mag solche Verweise sonst ja nicht, aber: Hier, bitte.



  • Ok aber wenn ich dort den Beispiel code durchgehe und ihn ausprobiere kommt bei mir immer:

    'exit': identifier not found

    Dabei habe ich die sqlite3.h doch eingebunden?!
    Jemand eine idee?




Anmelden zum Antworten