66

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

4

14 回答 14

52

这真的是在邀请反对票,但是这里......

我直接从 C++ 使用 sqlite,并没有看到任何添加 C++ 抽象层的价值。就这样,它非常好(而且效率很高)。

于 2010-10-12T13:26:34.697 回答
18

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

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

玩得开心 !

于 2014-05-14T19:37:53.557 回答
18

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

它支持 Oracle、PostgreSQL 和 MySQL。SQLite 后端位于 CVS中。

于 2008-09-23T13:02:06.500 回答
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

于 2011-06-24T13:50:59.270 回答
11

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

于 2009-11-09T12:45:40.083 回答
7

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

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());

只要您坚持使用 sqlite3 数据类型,您就需要编写 table 方法。因为一切都是模板,所以在 -O 之后没有多少抽象层代码。自然连接需要一个类似于 Person 类的结果类。该实现是一个少于 500 行的单个标题。许可证是 LGPL。资源

于 2013-04-09T14:34:30.757 回答
6

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

精简版 SQL

我的经历很糟糕。
我只是在研究什么 orm 使用,我正在测试很多。

缺点:

  • 没有文件
  • 没有解释性自述文件
  • 没有先决条件的解释
  • 由于很多错误而无法编译(不是真的,在 v0.3.17 中没有修复)
于 2014-07-24T07:50:17.220 回答
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";
于 2010-10-12T13:19:43.137 回答
4

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

于 2008-09-23T10:56:59.563 回答
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

没有比这更简单的了......

于 2008-12-23T00:12:57.750 回答
4

另一个简单的是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;
}
于 2013-09-15T19:19:16.407 回答
3

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

示例也应该在那个 git repo 的某个地方,相当容易使用。

于 2014-05-25T11:44:34.287 回答
3

也许你可以看看

http://pocoproject.org

或者

白金 C++ 框架

于 2009-05-04T19:29:48.077 回答
2

Oracle/OCI/ODBC Template Library

于 2010-04-21T01:56:35.640 回答