什么是一个很好的OO C ++包装的SQLite
我想为sqlitefind一个好的面向对象的C ++(而不是C)包装器。 人们推荐什么? 如果你有几个build议,请把它们分别用于投票。 另外,请说明您是否有任何关于您build议的包装的经验,以及您是如何使用的。
这真的是邀请反对票,但是这里…
我直接从C ++使用sqlite,并没有看到任何增加C + +抽象层的价值。 这是相当好(和高效)。
另一个对C ++数据库的封装是SOCI 。 这不是很OO,但更现代的C + +。
它支持Oracle,PostgreSQL和MySQL。 SQLite后端在CVS中 。
这是一段时间没有更新,但编译和运行在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有很好的约束力,可以很好地融入到它的整体devise中
我也不满意我能find的东西。 现在你可以写:
class Person { public: Person() {} static SqlTable<Person>& table() { static SqlTable<Person> tab = SqlTable<Person>::sqlTable("Person", SqlColumn<Person>("Firstname", makeAttr(&Reservation::firstname)), SqlColumn<Person>("Lastname", makeAttr(&Reservation::lastname)), SqlColumn<Person>("Age", makeAttr(&Reservation::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数据types,表格方法就是你需要编写的所有东西。 因为一切都是一个模板,所以在-O之后没有太多的抽象层代码。 自然连接需要类似于Person类的结果类。 实现是一个less于500行的单头。 许可证是LGPL。 资源
我也不满意任何我能find的,所以我写了我自己的: 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";
我阅读这篇文章,并尝试了答案中提到的一些库,
但是没有一个对我来说很简单(我是一个懒惰的程序员!)。
所以我写了自己的包装: 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;
玩的开心 !
http://www.codeproject.com/KB/database/CppSQLite.aspx是太棒了,它是很容易移植,我有它在半小时左右工作bcb5(omg)。; 它是尽可能薄,你可以得到和易于理解。 有大量的例子涵盖了你需要知道的每一件事情。 它使用exception来处理错误 – 我修改它以在几分钟内提供返回码。 唯一棘手的问题是创build自己的lib文件没有提供。
try { CppSQLite3DB db; db.open(asFileName.c_str()); db.execDML("Update data set hrx = 0"); } // try catch (...) { } // catch
不能比这更简单…..
每个人都对使用什么给出了很好的build议:我会告诉你什么仪器不使用。
LiteSQL 。
我的经验是可怕的。
我只是在做什么ORM使用的研究,我正在testing很多。
弱点:
- 没有文件
- 没有说明性的README
- 没有先决条件的解释
- 由于很多bug (不是真的,在v0.3.17中没有修复)
另一个简单的是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; } }
为了好玩,打开一个数据库,运行一个查询,并在一行中获取结果:
for ( auto & row : Database( "test.sqlite" ).query( "SELECT * FROM test").select() ) { cout << row.column_string( 0 ) << endl; }
我做了一个,因为我们公司的需要。 https://www.github.com/rubdos/libsqlitepp这是C + + 11,只有头。 只需将标题放在项目中,包含它并链接到C的sqlite库。
例子应该在那个git回购的地方,相当容易使用。
Oracle / OCI / ODBC模板库
你已经成功移植它为mingw-3.4.5? 你会分享移植版本吗?
谢谢。
http://www.codeproject.com/KB/database/CppSQLite.aspx是太棒了,它是很容易移植,我有它在半小时左右工作bcb5(omg)。; 它是尽可能薄,你可以得到和易于理解。 有大量的例子涵盖了你需要知道的每一件事情。 它使用exception来处理错误 – 我修改它以在几分钟内提供返回码。 唯一棘手的问题是创build自己的lib文件没有提供。