当前位置:  开发笔记 > 编程语言 > 正文

什么是sqlite的优秀OO C++包装器

如何解决《什么是sqlite的优秀OOC++包装器》经验,为你挑选了7个好方法。

我想为sqlite找到一个好的面向对象的C++(而不是C)包装器.人们推荐什么?如果您有多个建议,请将它们单独回复以进行投票.此外,请说明您是否有任何建议包装的经验以及您如何使用它.



1> Johan Kotlin..:

这真的是邀请下来投票,但这里......

我直接从C++使用sqlite,并没有看到添加C++抽象层的任何值.这是非常好的(和有效的).


那么你只有-4的两个downvotes我赞成你.使用C接口肯定是一个选项,可能是我们选择的.当然,我们可能会使用一些轻量级的C++包装器,可能是使用自定义删除器的boost :: shared_ptr,也可能是处理错误的异常,但实际上并不需要庞大的API.
同样,最后,这也是我们最理想的选择.

2> jk...:

用于C++数据库的另一个好方法是SOCI.它不是OO,而是更现代的C++.

它支持Oracle,PostgreSQL和MySQL.一个SQLite的后端是在CVS.



3> amin..:

我读了这篇文章并尝试了答案中提到的一些库,
但是对我来说这些都不够容易(我是一个懒惰的程序员!).

所以我写了自己的包装器: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;

玩得开心 !



4> markshiz..:

这是一段时间没有更新的,但是在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



5> zaharpopov..:

使用Qt - 它对SQLite具有很好的绑定性,非常适合其整体设计



6> 小智..:

我也对我能找到的东西不满意.现在你可以写:

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.资源



7> edam..:

我对任何我都找不到的东西都不满意,所以我写了自己的: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";

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有