66

sqlite用の(Cではなく)優れたオブジェクト指向のC++ラッパーを見つけたいと思います。人々は何をお勧めしますか?いくつかの提案がある場合は、投票のために別々の返信に入れてください。また、提案しているラッパーの経験があるかどうか、およびそれをどのように使用したかを示してください。

4

14 に答える 14

52

これは本当に賛成票を集めていますが、ここに行きます...

私はC++から直接sqliteを使用していますが、C++抽象化レイヤーが追加された値は表示されません。そのままでもかなり良い(そして効率的)です。

于 2010-10-12T13:26:34.697 に答える
18

C++ のデータベースのもう 1 つの適切なラッパーはSOCIです。あまりオブジェクト指向ではありませんが、よりモダンな C++ です。

Oracle、PostgreSQL、MySQL をサポートしています。SQLiteバックエンドは CVS にあります

于 2008-09-23T13:02:06.500 に答える
18

私はこの投稿を読み、回答に記載されているライブラリのいくつかを試しましたが、
どれも私にとって十分に簡単ではありませんでした (私は怠惰なプログラマーです!)。

だから私は自分のラッパーを書いた: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;

楽しむ !

于 2014-05-14T19:37:53.557 に答える
12

これはしばらく更新されていませんが、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();

参照: http://code.google.com/p/sqlite3pp/wiki/UsagePage

于 2011-06-24T13:50:59.270 に答える
11

Qtを使用してください-全体的なデザインにうまく適合するSQLiteの優れたバインディングがあります

于 2009-11-09T12:45:40.083 に答える
7

私はまた、私が見つけたものに満足していませんでした。これで、次のように記述できます。

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です。ソース

于 2013-04-09T14:34:30.757 に答える
5

どちらも見つけられなかったので、自分で書きました: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";
于 2010-10-12T13:19:43.137 に答える
4

もう 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;
}
于 2013-09-15T19:19:16.407 に答える
4

私はこれを使用しましたhttp://www.codeproject.com/KB/database/CppSQLite.aspxしかし、私はC#に移行したので、より新しい/より良いものがあるかもしれません

于 2008-09-23T10:56:59.563 に答える
4

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

これよりはるかに簡単なことはありません.....

于 2008-12-23T00:12:57.750 に答える
3

おそらくあなたは見てみることができます

http://pocoproject.org

また

プラチナ C++ フレームワーク

于 2009-05-04T19:29:48.077 に答える
2

Oracle/OCI/ODBC テンプレート ライブラリ

于 2010-04-21T01:56:35.640 に答える