Seite 1 von 2
Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 12:07 pm
von Bebu
Weiß jetzt nicht so recht, ob dass das richtige Forum dafür ist, aber notfalls kann man ja verschieben
Also ich noch unter Delphi programmiert habe, war ich eigentlich hauptsächlich mit Datenbanken am Arbeiten, z. B. für ein ganz einfaches Bibliotheksprogramm für die Schülerbibliothek. Es war sehr einfach gestrickt, aber damals habe ich hauptsächlich mit der Paradox Datenbank mit der Borland BDE gearbeitet.
So was ähnliches suche ich jetzt für C/C++. Welche Datenbank könnt ihr mir empfehlen, für eine Anwendung, die nur lokal auf einem Rechner liegt, also keine Webbasierung oder Zugriff über Netzwerk (Wenn die Möglichkeiten trotzdem vorhanden sind, nicht weiter schlimme müsste ich mich halt nichtmehr umstellen, wenn ich es doch mal brauchen sollte). Es müssen keine riesigen Datenmengen verwaltet werden und die Datenbankfelder sind vorher bekannt und müssen selten bis gar nicht dynamisch erweitert werden. Suchdurchläufe sind dagegen wieder recht häufig zu erwarten sowie die Verknüpfung von zwei voneinander abhängigen Datenbanken z. B. über Schlüsselpaare oder einfach nur ID Nummern. Also im Grunde eine mehrzeilige Liste (ob das der richtige Ausdruck dafür ist?

)
Außerdem muss sie folgende Vorraussetzungen erfüllen:
Keine zusätzlich Software muss installiert werden, die Datenbank lässt sich vollständig ins Programm einbetten.
Sie soll nichts kosten, das Programm wird nicht gewinnbringend sein, am liebsten OpenSource.
Die Datenbank lässt sich im Rahmen der Programminstallation vollständig aus Programmcode erstellen um die Installationsdatei möglichst klein zu halten(Programm wird per Email versandt).
Kennt ihr etwas, was meinen Anforderungen entspricht?
Edit: Hab noch eine wichtige Anforderung vergessen: Sie muss plattformübergreifend funktionieren
Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 1:38 pm
von Xin
Ich glaube SQLlite erfüllt Deine Anforderungen. Bin mir aber nicht sicher - da ich da auch noch nicht mit hantiert habe.
Könnte aber schonmal ein Google-Stichwort sein. ^
Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 2:57 pm
von Bebu
Danke Xin, das sieht doch schon mal sehr gut aus. Wieder was, wo ich mich reinlesen kann ^^
Aber auf den ersten Blick scheint es genau das zu sein, was ich suche. Mal sehen, wie leicht sich das ganze in ein Windowsprogramm integrieren lässt...
Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 7:07 pm
von AnGaiNoR
XML ist ja eigentlich kein Datenbanksystem, aber eignet sich meiner Meinung auch um Daten darzustellen. Einfach einzubetten ist es allemale und Suchanfragen lassen sich per XQuery einfach gestalten. Ich ziehe das menschenlesbare XML eigentlich einer binär gespeicherten Datenbank vor (die man ja nur schwer per Hand aus der Datei rauslesen kann).
Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 7:26 pm
von Xin
Bebu hat geschrieben:Danke Xin, das sieht doch schon mal sehr gut aus. Wieder was, wo ich mich reinlesen kann ^^
Aber auf den ersten Blick scheint es genau das zu sein, was ich suche. Mal sehen, wie leicht sich das ganze in ein Windowsprogramm integrieren lässt...
Wenn Du Dich einliest, kannst Du das ganze auch mal hier vorstellen?
Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 8:16 pm
von Bebu
AnGaiNoR hat geschrieben:XML ist ja eigentlich kein Datenbanksystem, aber eignet sich meiner Meinung auch um Daten darzustellen. Einfach einzubetten ist es allemale und Suchanfragen lassen sich per XQuery einfach gestalten. Ich ziehe das menschenlesbare XML eigentlich einer binär gespeicherten Datenbank vor (die man ja nur schwer per Hand aus der Datei rauslesen kann).
Kann ich mir auch mal ansehen, wie ist es denn bei XML mit Eintragsindizierung und Suchanfragen in den Daten?
Xin hat geschrieben:Wenn Du Dich einliest, kannst Du das ganze auch mal hier vorstellen?
Ich kann es mal versuchen^^ Die Dokus die ich bisher gefunden habe, war das meiset auf Englisch, das bringt mich zwar nicht um, aber dafür brauche ich dann wesentlich länger, so sicher bin ich da leider nicht. Aber ich kann es ja mal ins Auge fassen

Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 8:18 pm
von Xin
Bebu hat geschrieben:Xin hat geschrieben:Wenn Du Dich einliest, kannst Du das ganze auch mal hier vorstellen?
Ich kann es mal versuchen^^ Die Dokus die ich bisher gefunden habe, war das meiset auf Englisch, das bringt mich zwar nicht um, aber dafür brauche ich dann wesentlich länger, so sicher bin ich da leider nicht. Aber ich kann es ja mal ins Auge fassen

Darum wäre es ja schön, etwas auf Deutsch zu haben ^
Re: Suche die Datenbank die zu mir passt
Verfasst: Mo Nov 30, 2009 9:58 pm
von Kerli
Ich hab das unlängst auch einmal verwendet und dazu eine kleine C++ Wrapperklasse geschrieben:
Code: Alles auswählen
//------------------------------------------------------------------------------
// sqlite_cpp.hpp
// (c) copyright 2009 Thomas Geymayer <tomgey@gmail.com>
//------------------------------------------------------------------------------
/*!
* @file
* @brief
* @details
* @author Thomas Geymayer <tomgey@gmail.com>
* @date Date of Creation: 24.10.2009
*/
#ifndef SQLITE_CPP_HPP_
#define SQLITE_CPP_HPP_
#include <string>
#include <sqlite3.h>
#include <stdexcept>
#include <vector>
#include <map>
class SQLite
{
public:
typedef std::map<std::string,std::string> Row;
typedef std::vector<Row> Result;
//--------------------------------------------------------------------------
SQLite( const std::string& dbase )
{
checkCall( sqlite3_open(dbase.c_str(), &_db) );
}
//--------------------------------------------------------------------------
~SQLite()
{
sqlite3_close(_db);
}
//--------------------------------------------------------------------------
Result query( const std::string& query )
{
//std::cout << query << std::endl;
sqlite3_stmt *stmt;
checkCall( sqlite3_prepare_v2(_db, query.c_str(), query.size(), &stmt, 0) );
int cols = sqlite3_column_count(stmt);
Result result;
while( sqlite3_step(stmt) == SQLITE_ROW )
{
Row cur_row;
for( int i = 0; i < cols; ++i )
{
if( !sqlite3_column_name(stmt,i) )
continue;
std::string name( sqlite3_column_name(stmt,i) );
if( name.empty() )
continue;
std::string value;
if( sqlite3_column_text(stmt,i) )
value = reinterpret_cast<const char*>(sqlite3_column_text(stmt,i));
cur_row[ name ] = value;
}
result.push_back(cur_row);
}
sqlite3_finalize(stmt);
return result;
}
//--------------------------------------------------------------------------
void insert( const std::string& table,
const Row& values )
{
std::string col_names, col_values;
for( Row::const_iterator col = values.begin();
col != values.end();
++col )
{
if( !col_names.empty() )
{
col_names += ",";
col_values += ",";
}
col_names += "`" + col->first + "`";
col_values += "'" + col->second + "'";
}
query( "INSERT INTO " + table
+ " (" + col_names + ") VALUES (" + col_values + ")" );
}
//--------------------------------------------------------------------------
Result select( const std::string& table,
const Row& values )
{
std::string checks;
for( Row::const_iterator col = values.begin();
col != values.end();
++col )
{
if( !checks.empty() )
checks += " and ";
checks += "`" + col->first + "`='" + col->second + "'";
}
return query( "SELECT * FROM " + table + " WHERE " + checks );
}
//--------------------------------------------------------------------------
void update( const std::string& table,
const Row& values,
const std::string& where )
{
std::string sets;
for( Row::const_iterator col = values.begin();
col != values.end();
++col )
{
if( !sets.empty() )
sets += ',';
sets += "`" + col->first + "`='" + col->second + "'";
}
query( "UPDATE " + table + " SET " + sets + " WHERE " + where );
}
//--------------------------------------------------------------------------
void deleteFrom( const std::string& table,
const Row& checks,
const std::string& id_col )
{
Result values = select(table, checks);
for( Result::const_iterator row = values.begin();
row != values.end();
++row )
{
query( "DELETE FROM " + table
+ " WHERE `" + id_col + "`='" + row->at(id_col) + "'" );
}
}
private:
void checkCall( int retval )
{
if( retval != SQLITE_OK )
throw std::runtime_error( sqlite3_errmsg(_db) );
}
sqlite3* _db;
};
#endif /* SQLITE_CPP_HPP_ */
Für die Abfragen und das Erstellen der Tabellen kannst du eh normales bzw. etwas eingeschränktes SQL verwenden. Es gibt zb was ich weiß nur INTEGER, TEXT, REAL und BLOB als Datentyp, aber das schaust du am Besten direkt in der
Dokumentation nach.
Eine Tabelle kannst du zb mit "sqlite3 messages.db < schema.sql" aus der Kommandozeile erzeugen. Wenn die schema.sql wie folgt ausschaut:
Code: Alles auswählen
DROP TABLE IF EXISTS messages;
CREATE TABLE messages(
id INTEGER PRIMARY KEY AUTOINCREMENT,
inserted INTEGER NOT NULL DEFAULT 0,
message_sent INTEGER NOT NULL DEFAULT 0,
type TEXT,
host TEXT,
service TEXT,
state TEXT,
duration TEXT,
email TEXT
);
dann kannst du mit folgendem Code etwas einfügen und nachher die gesamte Tabelle ausgeben lassen:
Code: Alles auswählen
int main(int argc, char* argv[])
{
// open the database
SQLite db("messages.db");
// create new entry
SQLite::Row input;
input["type" ] = argv[2];
input["host" ] = argv[3];
input["service" ] = argv[4];
input["state" ] = argv[5];
input["duration" ] = argv[6];
input["email" ] = argv[7];
std::cout << "Inserting new notification..." << std::endl;
db.insert("messages", input);
// print out the database
SQLite::Result result = db.query("select * from messages");
for( SQLite::Result::iterator row = result.begin();
row != result.end();
++row )
{
std::cout << "-----------------------------------------------------------"
<< "---------------------" << std::endl;
std::cout << row->at("id") << "|"
<< row->at("type") << "|"
<< row->at("host") << "|"
<< row->at("service") << "|"
<< row->at("state") << "|"
<< row->at("duration")<< "|"
<< row->at("inserted")<< "|"
<< row->at("message_sent")
<< std::endl;
}
return 0;
}
Re: Suche die Datenbank die zu mir passt
Verfasst: Di Dez 01, 2009 2:56 pm
von Xin
Hey, Kerli...
Pack sowas doch ins Wiki!
Sowas geht doch im Forum einfach unter und dann findet es wieder keiner!
Re: Suche die Datenbank die zu mir passt
Verfasst: Di Dez 01, 2009 7:52 pm
von Bebu
Hui, bin grade ganz erschlagen von meiner Unwissenheit Kerli
Deine Klasse muss ich mir mal ganz in Ruhe ansehen, mein Wissen über Klassen ist wohl noch seeeeeehhhhhrrrrr ausbaufähig.
Aber trotzdem danke dafür, ich denke das wird mir noch sehr nützlich sein.