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

时间:2008-09-23 10:49:22

标签: c++ database sqlite

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

16 个答案:

答案 0 :(得分:46)

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

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

答案 1 :(得分:17)

C ++中数据库的另一个好的包装是SOCI。它不是OO,而是更现代的C ++。

它支持Oracle,PostgreSQL和MySQL。一个SQLite backend is in the CVS

答案 2 :(得分:13)

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

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

玩得开心!

答案 3 :(得分: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

答案 4 :(得分:11)

使用Qt - 它对SQLite有很好的约束力,非常适合其整体设计

答案 5 :(得分:7)

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

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数据类型,就可以编写表方法。由于一切都是模板,因此在-O之后仍然没有多少抽象层代码。自然连接需要类似于Person类的结果类。实现是一个少于500行的标题。许可证是LGPL。 Source

答案 6 :(得分: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";

答案 7 :(得分:4)

我已经使用了这个http://www.codeproject.com/KB/database/CppSQLite.aspx但我已经转移到了C#,所以现在可能会有更新/更好的

答案 8 :(得分:4)

http://www.codeproject.com/KB/database/CppSQLite.aspx真是太棒了,它很容易移植,我让它在半小时左右的时间内在bcb5(omg)上工作。它几乎可以获得并且易于理解。有很多例子涵盖了你需要知道的每件事。它使用异常进行错误处理 - 我修改它以在几分钟内提供返回代码。唯一棘手的问题是创建自己的lib文件没有提供。

try
{

    CppSQLite3DB db;

    db.open(asFileName.c_str());

    db.execDML("Update data set hrx = 0");

} // try

catch (...)
{

} // catch

不能比这简单得多.....

答案 9 :(得分:4)

每个人都对使用的内容给出了很好的建议:我会告诉你使用什么工具。

LiteSQL

我的经历非常糟糕 我只是在研究一下orm的用途,我正在测试它的很多。

弱点:

  • 没有文档
  • 无解释性自述文件
  • 没有关于先决条件的解释
  • 由于很多bug而无法编译(isn&#39; t,在v0.3.17中未修复)

答案 10 :(得分:3)

答案 11 :(得分:3)

另一个简单的是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;
}

答案 12 :(得分:3)

由于我们公司的需要,我做了一个。 https://www.github.com/rubdos/libsqlitepp 这是C ++ 11,仅限标题。只需将标题放在项目中,包含它并链接到C sqlite库。

示例应该在git repo的某处,相当容易使用。

答案 13 :(得分:2)

答案 14 :(得分:0)

这个图书馆很棒。

http://www.sqlapi.com/

有可用的Windows和Linux版本的库,我在几分钟内启动并运行。

答案 15 :(得分:-1)

您是否已成功将其移植到mingw-3.4.5?你会分享移植版本吗?

THX。

http://www.codeproject.com/KB/database/CppSQLite.aspx真是太棒了,它很容易移植,我让它在半小时左右的时间内在bcb5(omg)上工作。它几乎可以获得并且易于理解。有很多例子涵盖了你需要知道的每件事。它使用异常进行错误处理 - 我修改它以在几分钟内提供返回代码。唯一棘手的问题是创建自己的lib文件没有提供。