我想找一个好的面向对象的C++(而不是C)封装来使用sqlite。人们有什么推荐吗?如果您有多个建议,请将它们放在单独的回复中以便投票。此外,请指出您对所建议的封装是否有任何经验,并说明您如何使用它。
这可能会招致负评,但我还是要说...
我直接从C++中使用sqlite,不认为添加一个C++抽象层有任何价值。现在它已经非常好了(而且高效)。
我读了这篇文章并尝试了其中提到的一些库,但它们中没有一个对我来说足够简单(我是一个懒惰的程序员!)。
所以我写了自己的包装器: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());
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";
因为公司需求,所以我做了一个。 https://www.github.com/rubdos/libsqlitepp 它是使用C++11编写的,并且只包含头文件。只需将头文件放入您的项目中,包含它并链接到C sqlite库即可。
该git存储库中应该也有一些示例,使用起来相当简单。
我曾经使用过这个http://www.codeproject.com/KB/database/CppSQLite.aspx,但现在我转到了C#,所以现在可能有更新/更好的选择。