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





Я использовал этот http://www.codeproject.com/KB/database/CppSQLite.aspx, но я перешел на C#, так что теперь могут быть более новые / лучшие
Еще одна хорошая оболочка для баз данных на C++ - СОЦИ. Это не очень объектно-ориентированный, но более современный C++.
Он поддерживает Oracle, PostgreSQL и MySQL. А Серверная часть SQLite находится в CVS.
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
Что может быть проще этого ...
Используйте Qt - он имеет отличную привязку для SQLite, которая хорошо вписывается в его общий дизайн
Мне тоже не понравилось то, что я смог найти, поэтому я написал свое: 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";
Его больше нельзя скачать?
Это действительно заманчивые голоса против, но вот ...
Я использую sqlite непосредственно из C++ и не вижу никакой ценности с добавленным слоем абстракции C++. Это неплохо (и эффективно) как есть.
Ну, у вас только -4 за два голоса против, и я проголосовал за вас. Использование интерфейса C, безусловно, является вариантом и, вероятно, будет тем, что мы выберем. Конечно, мы можем использовать несколько легких оболочек C++, возможно, boost :: shared_ptr с настраиваемыми удалителями и, возможно, исключение для обработки ошибок, но реальной необходимости в огромном API нет.
@CashCow: Да - спасибо - я сделал то же самое.
Точно так же, в конце концов, это была и самая разумная альтернатива, которая у нас была.
Вот тот, который давно не обновлялся, но компилируется и работает в 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();
Я также не был доволен тем, что смог найти. Теперь вы можете написать:
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. Поскольку все является шаблоном, после -O остается не так много кода уровня абстракции. Для естественных соединений требуется класс результата, аналогичный классу Person. Реализация представляет собой один заголовок с менее чем 500 строками. Лицензия LGPL. Источник
Другой простой - 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;
}
Я прочитал этот пост и попробовал некоторые из библиотек, упомянутых в ответах,
Но ни один из них не дался мне достаточно легко (я ленивый программист!).
Итак, я написал свою собственную обертку: sqlite современный 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;
Веселиться !
Я сделал один из-за необходимости в нашей компании. https://www.github.com/rubdos/libsqlitepp Это C++ 11 и только заголовок. Просто поместите заголовок в свой проект, включите его и сделайте ссылку на библиотеки C sqlite.
Примеры должны быть где-то в этом репозитории git, довольно простые в использовании.
Все дали хороший совет, что использовать: я расскажу, какой инструмент НЕТ использовать.
Мой опыт ужасен. Я просто изучаю, что используют orm, и много тестирую.
Недостатки:
Также проверьте список по адресу: sqlite.org/cvstrac/wiki?p=SqliteWrappers