sqlite用の(Cではなく)優れたオブジェクト指向のC++ラッパーを見つけたいと思います。人々は何をお勧めしますか?いくつかの提案がある場合は、投票のために別々の返信に入れてください。また、提案しているラッパーの経験があるかどうか、およびそれをどのように使用したかを示してください。
14 に答える
これは本当に賛成票を集めていますが、ここに行きます...
私はC++から直接sqliteを使用していますが、C++抽象化レイヤーが追加された値は表示されません。そのままでもかなり良い(そして効率的)です。
C++ のデータベースのもう 1 つの適切なラッパーはSOCIです。あまりオブジェクト指向ではありませんが、よりモダンな C++ です。
Oracle、PostgreSQL、MySQL をサポートしています。SQLiteバックエンドは CVS にあります。
私はこの投稿を読み、回答に記載されているライブラリのいくつかを試しましたが、
どれも私にとって十分に簡単ではありませんでした (私は怠惰なプログラマーです!)。
だから私は自分のラッパーを書いた:sqlite modern cpp
database db("dbfile.db");
// executes the query and creates a 'user' table if not exists
db << "create table if not exists user ("
" age int,"
" name text,"
" weight real"
");";
// inserts a new user and binds the values to '?' marks
db << "insert into user (age,name,weight) values (?,?,?);"
<< 20
<< "bob"
<< 83.0;
// slects from table user on a condition ( age > 18 ) and executes
// the lambda for every row returned .
db << "select age,name,weight from user where age > ? ;"
<< 18
>> [&](int age, string name, double weight) {
cout << age << ' ' << name << ' ' << weight << endl;
};
// selects the count(*) of table user
int count = 0;
db << "select count(*) from user" >> count;
楽しむ !
これはしばらく更新されていませんが、Mac OS GCC 4.3 でコンパイルおよび実行されるものです。また、MIT ライセンスの下でリリースされているため、商用プロジェクトで問題なく使用できます。 http://code.google.com/p/sqlite3pp/
使用法はブースト化されており、非常にクリーンです。
sqlite3pp::database db("test.db");
sqlite3pp::transaction xct(db);
{
sqlite3pp::command cmd(db, "INSERT INTO contacts (name, phone) VALUES (:user, :phone)");
cmd.bind(":user", "Mike");
cmd.bind(":phone", "555-1234");
cmd.execute();
}
xct.rollback();
Qtを使用してください-全体的なデザインにうまく適合するSQLiteの優れたバインディングがあります
私はまた、私が見つけたものに満足していませんでした。これで、次のように記述できます。
class Person {
public:
Person() {}
static SqlTable<Person>& table() {
static SqlTable<Person> tab = SqlTable<Person>::sqlTable("Person",
SqlColumn<Person>("Firstname", makeAttr(&Person::firstname)),
SqlColumn<Person>("Lastname", makeAttr(&Person::lastname)),
SqlColumn<Person>("Age", makeAttr(&Person::age)),
return tab;
}
std::string firstname;
std::string lastname;
int age;
};
SqliteDB db("testtable.db");
auto sel(db.select<Person>("Firstname=\"Danny\" and Lastname=\"Zeckzer\""));
std::for_each(sel.first, sel.second, [](const Person& p) {
...
Person me;
db.insert<Person>(me);
...
std::vector<Person> everybody;
db.insert<Person>(everybody.begin(), everybody.end());
sqlite3 データ型に固執する限り、テーブル メソッドだけを記述する必要があります。すべてがテンプレートであるため、-O の後に残る抽象化レイヤーのコードはほとんどありません。自然結合には、Person クラスと同様の結果クラスが必要です。実装は、500 行未満の単一ヘッダーです。ライセンスはLGPLです。ソース
どちらも見つけられなかったので、自分で書きました:sqlite3cc。
コード例を次に示します。
sqlite::connection db( filename );
sqlite::command c( db, "UPDATE foo SET bar = ? WHERE name = ?" );
c << 123 << name << sqlite::exec;
sqlite::query q( db, "SELECT foo FROM bar" );
for( sqlite::query::iterator i = q.begin(); i != q.end(); i++ )
std::cout << i->column< std::string >( 0 ) << "\n";
もう 1 つの単純なものはNLDatabaseです。免責事項: 私は著者です。基本的な使用法 (正直なところ、これから「基本的な」以上のことは得られません) は次のようになります。
#include "NLDatabase.h"
using namespace std;
using namespace NL::DB;
int main(int argc, const char * argv[]) {
Database db( "test.sqlite" );
auto results = db.query("SELECT * FROM test WHERE name <> ?").select("TOM");
for ( auto const & row : results ) {
cout << "column[0]=" << row.column_string( 0 ) << endl;
}
}
楽しみのために、データベースを開き、クエリを実行し、結果をすべて 1 行で取得します。
for ( auto & row : Database( "test.sqlite" ).query( "SELECT * FROM test").select() ) {
cout << row.column_string( 0 ) << endl;
}
私はこれを使用しましたhttp://www.codeproject.com/KB/database/CppSQLite.aspxしかし、私はC#に移行したので、より新しい/より良いものがあるかもしれません
http://www.codeproject.com/KB/database/CppSQLite.aspxは素晴らしいです。移植は非常に簡単です。bcb5 (omg) で 30 分ほどで作業できました。それはあなたが得ることができるほど薄く、理解しやすいです。あなたが知る必要があるほぼすべてのことをカバーするかなりの数の例があります. エラー処理に例外を使用します - 数分でリターン コードを提供するように変更しました。唯一のトリッキーな問題は、提供されていない独自の lib ファイルを作成することです。
try
{
CppSQLite3DB db;
db.open(asFileName.c_str());
db.execDML("Update data set hrx = 0");
} // try
catch (...)
{
} // catch
これよりはるかに簡単なことはありません.....