2008-09-23 2 views
52

Я бы хотел найти хороший объектно-ориентированный C++ (в отличие от C) обертки для sqlite. Что рекомендуют люди? Если у вас есть несколько предложений, пожалуйста, разместите их в отдельных ответах для голосования. Также, пожалуйста, укажите, есть ли у вас опыт обертки, которую вы предлагаете, и как вы ее нашли.Что такое OO C++-оболочка для sqlite

+1

Также ознакомьтесь с перечнем по адресу: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers – User 2011-08-02 18:44:46

ответ

0

Эта библиотека является блестящим.

http://www.sqlapi.com/

Есть ОС Windows и Linux версии библиотеки доступен, и я был запущен и работает в течение нескольких минут.

+16

Я работаю Что в этом прекрасного? – 2010-04-21 02:08:05

+8

Обратите внимание, что библиотека является условно-бесплатной. Я понял об этом, когда изменил весь свой источник ... – NeDark 2010-12-02 22:00:04

+19

На сайте говорится: «Если вы просматриваете локальную копию SQLAPI ++ Web, пожалуйста, посетите официальную страницу заказа на сайте www.sqlapi.com \ Order, чтобы убедиться, что цены подняты -встретиться." Честно говоря, мне неудобно платить за библиотеку кода от разработчика, который не знает, что обратная косая черта не принадлежит к URI. ;) – 2011-09-10 01:32:06

16

Другим хорошим wraper для баз данных в C++ является SOCI. Это не очень OO, но более современный C++.

Он поддерживает Oracle, PostgreSQL и MySQL. A SQLite backend is in the CVS.

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 

Не может быть гораздо проще, чем это .....

-1

ли вы успешно портировали для MinGW-3.4.5? Вы поделитесь с портированной версией?

Thx.

http://www.codeproject.com/KB/database/CppSQLite.aspx просто фантастический, его очень легко порт, у меня он работал на bcb5 (omg) через полчаса или около того. Он примерно такой же тонкий, как вы можете получить и легко понять. Есть много примеров, которые охватывают практически все, что вам нужно знать. Он использует исключения для обработки ошибок - я изменил его, чтобы обеспечить коды возврата в течение нескольких минут. Только сложная проблема заключается в создании собственного файла lib, который не предоставляется.

11

использования Qt - он имеет большой привязки для SQLite, которая хорошо вписывается в его общий дизайн

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"; 
44

Это действительно пригласив понижающий голос, но здесь идет ...

Я использую sqlite непосредственно из C++ и не вижу никакого значения с добавленным уровнем абстракции C++. Это неплохо (и эффективно), как есть.

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

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

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; 
} 
6

Я прочитал этот пост и попробовал некоторые из библиотек, упомянутых в ответах,
Но ни один из них не было достаточно легко для меня (я ленивый программист!).

Так я написал свою собственную обертку: 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

Я сделал один из-за необходимости в нашей компании. https://www.github.com/rubdos/libsqlitepp Это C++ 11 и только заголовок. Просто поместите заголовок в свой проект, включите его и подключитесь к библиотекам C sqlite.

Примеры должны быть где-то на этом git repo тоже, достаточно просты в использовании.

4

Все дали хороший совет относительно того, что использовать: я скажу вам, какой инструмент НЕ.

LiteSQL.

Мой опыт ужасен.
Я просто занимаюсь изучением того, что использует орм, и я тестирую его много.

Слабость:

  • нет документации
  • нет пояснительной README
  • никаких объяснений по предпосылкам
  • не компилировать из-за большое количеством bug (не являются истинным, не фиксируются v0.3.17)
Смежные вопросы