我想为sqlite找到一个好的面向对象的C++(而不是C)包装器.人们推荐什么?如果您有多个建议,请将它们单独回复以进行投票.此外,请说明您是否有任何建议包装的经验以及您如何使用它.
这真的是邀请下来投票,但这里......
我直接从C++使用sqlite,并没有看到添加C++抽象层的任何值.这是非常好的(和有效的).
用于C++数据库的另一个好方法是SOCI.它不是OO,而是更现代的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();
请参阅:http://code.google.com/p/sqlite3pp/wiki/UsagePage
使用Qt - 它对SQLite具有很好的绑定性,非常适合其整体设计
我也对我能找到的东西不满意.现在你可以写:
class Person { public: Person() {} static SqlTable& table() { static SqlTable tab = SqlTable ::sqlTable("Person", SqlColumn ("Firstname", makeAttr(&Reservation::firstname)), SqlColumn ("Lastname", makeAttr(&Reservation::lastname)), SqlColumn ("Age", makeAttr(&Reservation::age)), return tab; } std::string firstname; std::string lastname; int age; }; SqliteDB db("testtable.db"); auto sel(db.select ("Firstname=\"Danny\" and Lastname=\"Zeckzer\"")); std::for_each(sel.first, sel.second, [](const Person& p) { ... Person me; db.insert (me); ... std::vector everybody; db.insert (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";