2008-09-23 29 views
52

Tôi muốn tìm một đối tượng tốt có định hướng C++ (như trái ngược với C) wrapper cho sqlite. Mọi người khuyên gì? Nếu bạn có một số gợi ý, vui lòng đặt chúng trong các câu trả lời riêng cho mục đích bỏ phiếu. Ngoài ra, vui lòng cho biết bạn có bất kỳ trải nghiệm nào về trình bao bọc mà bạn đang đề xuất và cách bạn tìm thấy nó để sử dụng hay không.Trình bao bọc OO C++ tốt cho sqlite

+1

Ngoài ra, hãy kiểm tra danh sách tại: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers – User

Trả lời

0

Thư viện này là rực rỡ.

http://www.sqlapi.com/

Có Windows và các phiên bản Linux của thư viện có sẵn và tôi đã dậy và chạy trong vài phút.

+16

Tôi là cur ious gì rực rỡ về nó? –

+8

Lưu ý thư viện là phần mềm chia sẻ. Tôi nhận ra rằng khi tôi đã thay đổi tất cả nguồn của mình ... – NeDark

+19

Trang web nói "Nếu bạn đang duyệt bản sao cục bộ của SQLAPI ++ Web, vui lòng truy cập trang đặt hàng chính thức tại www.sqlapi.com \ Order để xác minh rằng giá đang tăng -to-date. " Thành thật mà nói, tôi không thoải mái khi trả tiền cho một thư viện mã từ một nhà phát triển không biết rằng dấu gạch chéo ngược không thuộc về một URI. ;) –

16

Một trình bao bọc tốt khác cho cơ sở dữ liệu trong C++ là SOCI. Nó không phải là rất OO, nhưng C++ hiện đại hơn.

Nó hỗ trợ Oracle, PostgreSQL và MySQL. A SQLite backend is in the CVS.

4

http://www.codeproject.com/KB/database/CppSQLite.aspx thật tuyệt vời, nó rất dễ dàng để cổng, tôi đã có nó làm việc trên bcb5 (omg) trong nửa giờ hoặc lâu hơn. Đó là về mỏng như bạn có thể nhận được và dễ hiểu. Có một số lượng tốt các ví dụ bao gồm tất cả mọi thứ bạn cần biết. Nó sử dụng các ngoại lệ để xử lý lỗi - tôi đã sửa đổi nó để cung cấp mã trả về trong một phút. Chỉ có vấn đề khó khăn là tạo tập tin lib của riêng bạn không được cung cấp.

try 
{ 

    CppSQLite3DB db; 

    db.open(asFileName.c_str()); 

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

} // try 

catch (...) 
{ 

} // catch 

Không thể đơn giản hơn nhiều so với này .....

-1

Bạn đã chuyển thành công nó cho mingw-3.4.5? Bạn sẽ chia sẻ phiên bản được chuyển?

Thx.

http://www.codeproject.com/KB/database/CppSQLite.aspx thật tuyệt vời, rất dễ dàng để cổng, tôi đã làm việc trên bcb5 (omg) trong nửa giờ hoặc lâu hơn. Đó là về mỏng như bạn có thể nhận được và dễ hiểu. Có một số lượng tốt các ví dụ bao gồm tất cả mọi thứ bạn cần biết. Nó sử dụng các ngoại lệ để xử lý lỗi - tôi đã sửa đổi nó để cung cấp mã trả về trong một phút. Chỉ có vấn đề khó khăn là tạo tập tin lib của riêng bạn không được cung cấp.

11

Sử dụng Qt - nó có lớn bắt buộc đối với SQLite mà cũng phù hợp vào thiết kế tổng thể của nó

5

Tôi không hài lòng với bất kỳ điều gì tôi có thể tìm thấy, vì vậy tôi đã viết của riêng mình: sqlite3cc.

Dưới đây là một ví dụ mã:

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"; 
+0

Nó không còn có sẵn để tải xuống? – NeDark

+0

Có, nó có sẵn. Chưa có bản phát hành thích hợp nào. Bạn có thể lấy mã nguồn từ kho lưu trữ ở đây (http://www.waxworlds.org/edam/software/sqlite3cc#repository) hoặc [ở đây] (https://code.launchpad.net/sqlite3cc) (bạn sẽ cần tải xuống các công cụ RCS chợ từ [ở đây] (http://bazaar.canonical.com/) nếu bạn không có chúng) hoặc bạn có thể xem mã nguồn trực tuyến [tại đây] (http: //bazaar.launchpad.net/~edam/sqlite3cc/trunk/files) – edam

44

Điều này thực sự đang mời xuống phiếu, nhưng ở đây đi ...

Tôi sử dụng sqlite trực tiếp từ C++ và không thấy bất kỳ giá trị nào có lớp trừu tượng C++ được thêm vào. Nó khá tốt (và hiệu quả) như vậy.

+7

Vâng, bạn chỉ có -4 cho hai downvotes và tôi upvoted bạn. Sử dụng giao diện C chắc chắn là một lựa chọn và có thể là một lựa chọn mà chúng tôi chọn. Tất nhiên chúng ta có thể sử dụng một vài trình bao bọc C++ nhẹ, có thể tăng :: shared_ptr với các deleters tùy chỉnh, và có thể là ngoại lệ để xử lý các lỗi, nhưng không có nhu cầu thực sự cho một API khổng lồ. – CashCow

+0

@CashCow: Có - cảm ơn - tôi cũng làm như vậy. –

+1

Tương tự như vậy, cuối cùng, đây là lựa chọn lành mạnh nhất mà chúng tôi đã có. – WhozCraig

12

Đây là bản chưa được cập nhật trong một thời gian, nhưng biên dịch và chạy trên Mac OS GCC 4.3. Nó cũng được phát hành theo Giấy phép MIT, vì vậy bạn có thể sử dụng nó trong một dự án thương mại, không có vấn đề gì. http://code.google.com/p/sqlite3pp/

Việc sử dụng là tăng-ified và rất sạch sẽ:

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

Xem: http://code.google.com/p/sqlite3pp/wiki/UsagePage

7

Tôi cũng không hài lòng với những gì tôi có thể tìm thấy. Bây giờ bạn có thể viết:

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

Phương pháp bảng là tất cả những gì bạn cần để viết miễn là bạn dính vào các loại dữ liệu sqlite3. Như tất cả mọi thứ là một mẫu không có nhiều lớp trừu tượng mã vẫn còn sau-O. Tham gia tự nhiên yêu cầu một lớp kết quả tương tự như lớp Person. Việc triển khai thực hiện là một tiêu đề có ít hơn 500 dòng. Giấy phép là LGPL. Source

3

Một cách đơn giản khác là NLDatabase. Disclaimer: Tôi là tác giả. Sử dụng cơ bản (và thành thật mà nói, bạn sẽ không nhận được nhiều hơn "cơ bản" từ trang này) trông giống như sau:

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

Và chỉ để vui, mở cơ sở dữ liệu, chạy truy vấn và tìm nạp kết quả trong một dòng:

for (auto & row : Database("test.sqlite").query("SELECT * FROM test").select()) { 
    cout << row.column_string(0) << endl; 
} 
6

tôi đọc bài đăng này và thử một số các thư viện được đề cập trong câu trả lời,
Nhưng không ai trong số họ là đủ dễ dàng cho tôi (tôi là một lập trình viên lười biếng!).

Vì vậy, tôi đã viết wrapper của riêng tôi: 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; 

Hãy vui vẻ!

3

Tôi đã thực hiện một điều này vì nhu cầu trong công ty của chúng tôi. https://www.github.com/rubdos/libsqlitepp Đó là C++ 11 và chỉ tiêu đề. Chỉ cần đặt tiêu đề trong dự án của bạn, bao gồm nó và liên kết đến các thư viện sqlite C.

Ví dụ phải ở đâu đó trên đó, cũng khá dễ sử dụng.

4

Mọi người đều đã đưa ra lời khuyên tốt về những gì cần sử dụng: Tôi sẽ cho bạn biết công cụ KHÔNG sử dụng nào.

LiteSQL.

Trải nghiệm của tôi thật khủng khiếp.
Tôi chỉ đang thực hiện một số nghiên cứu về việc sử dụng orm và tôi đang thử nghiệm rất nhiều.

Điểm yếu:

  • không có tài liệu
  • không README giải thích
  • có lời giải thích về điều kiện tiên quyết
  • không biên dịch do rất nhiều bug (là không đúng sự thật, không được cố định trong v0.3.17)
Các vấn đề liên quan