《A SQLite client library written in Modern C++》要點(diǎn):
本文介紹了A SQLite client library written in Modern C++,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
smartdb是一個(gè)純c++11開發(fā),header-only,簡(jiǎn)練高效的sqlite封裝庫(kù).
連接數(shù)據(jù)庫(kù),若test.db
不存在,則會(huì)創(chuàng)立一個(gè).
INSERT操作.
std::string sql = "INSERT INTO PersonTable(id, name, address) VALUES(?, ?, ?)"; db.execute(sql, 1, "Jack", nullptr);
或者可以如許寫:
std::string sql = "INSERT INTO PersonTable(id, name, address) VALUES(?, ?, ?)"; db.execute(sql, std::forward_as_tuple(1, "Jack", nullptr));
正如你所看到的,execute支持變參和std::tuple作為變量替換SQL里面的?
,其中nullptr
可以將數(shù)據(jù)庫(kù)字段設(shè)置成null
值,若要進(jìn)行批量插入,建議使用事務(wù)和prepare進(jìn)行處置,具體操作請(qǐng)看Example
.
SELECT操作
db.execute("SELECT * FROM PersonTable"); while (!db.isEnd) { std::cout << "id: " << db.getFiled<sqlite3_int64>(0) << std::endl; std::cout << "name: " << db.getFiled<std::string>(1) << std::endl; std::cout << "address: " << db.getFiled<std::string>(2) << std::endl; db.moveNext; }
使用isEnd
和moveNext
即可遍歷結(jié)果集,獲取字段值必要提供字段的類型以及字段序號(hào),沒有使用字段名來代替字段序號(hào)來獲取值,主要是考慮到效率問題.
使用聚合函數(shù)
db.execute("SELECT COUNT(*) FROM PersonTable"); if (db.recordCount == 1 && !db.isEnd) { std::cout << db.getFiled<sqlite3_int64>(0) << std::endl; }
#include <iostream>#include <fstream>#include "Timer.hpp"#include "smartdb/Database.hpp"void testInsertTable{ smartdb::Database db; bool ok = db.open("test.db"); std::string sql = "DROP TABLE PersonTable"; ok = db.execute(sql); sql = "CREATE TABLE if not exists PersonTable(id INTEGER NOT NULL, name Text, address Text)"; ok = db.execute(sql); Timer t; sql = "INSERT INTO PersonTable(id, name, address) VALUES(?, ?, ?)"; const char* name = "Jack"; std::string city = "Chengdu"; // 預(yù)處置sql. ok = db.prepare(sql); // 開始事務(wù). ok = db.begin; bool ret = true; for (int i = 1; i < 1000000; ++i) { // 綁定參數(shù). /* ret = db.addBindValue(std::forward_as_tuple(i, name, city)); */ ret = db.addBindValue(i, name, city); if (!ret) { std::cout << "Error message: " << db.getErrorMessage << std::endl; break; } } if (ret) { // 提交事務(wù). ok = db.commit; } else { // 回滾事務(wù). ok = db.rollback; } // 100w 800~1000ms. std::cout << "Insert elapsed: " << t.elapsed << std::endl; t.reset; // select. ok = db.execute("SELECT * FROM PersonTable"); std::cout << "Record count: " << db.recordCount << std::endl; while (!db.isEnd) { db.moveNext; } // 100w 300~500ms. std::cout << "Select elapsed: " << t.elapsed << std::endl; (void)ok;}void testInsertTable2{ smartdb::Database db; bool ok = db.open("test.db"); std::string sql = "DROP TABLE PersonTable2"; ok = db.execute(sql); sql = "CREATE TABLE if not exists PersonTable2(id INTEGER NOT NULL, name Text, address Text, headerImage BLOB)"; ok = db.execute(sql); // 讀取一張圖片. std::ifstream fin; fin.open("./1.jpg", std::ios::binary); ok = fin.is_open; char buf[50 * 1025] = {"\0"}; fin.read(buf, sizeof(buf)); std::string image = std::string(buf, fin.gcount); smartdb::Blob headImage; headImage.buf = image.c_str; headImage.size = image.length; sql = "INSERT INTO PersonTable2(id, name, address, headerImage) VALUES(?, ?, ?, ?)"; for (int i = 0; i < 10; ++i) { /* ok = db.execute(sql, i, "Tom", nullptr, headImage); */ ok = db.execute(sql, std::forward_as_tuple(i, "Tom", nullptr, headImage)); } // update. sql = "UPDATE PersonTable2 SET address=? WHERE id=?"; if (!db.execute(sql, "中國(guó)", 0)) { std::cout << "Error message: " << db.getErrorMessage << std::endl; return; } std::cout << "Update success, affected rows: " << db.affectedRows << std::endl; // select. ok = db.execute("SELECT * FROM PersonTable2 WHERE id=?", 0); /* ok = db.execute("SELECT * FROM PersonTable2"); */ while (!db.isEnd) { try { std::cout << "id: " << db.getFiled<sqlite3_int64>(0) << std::endl; std::cout << "name: " << db.getFiled<std::string>(1) << std::endl; std::cout << "address: " << db.getFiled<std::string>(2) << std::endl; std::cout << "image size: " << db.getFiled<std::string>(3).size << std::endl; } catch (std::exception& e) { std::cout << "Exception: " << e.what << std::endl; return; } db.moveNext; } ok = db.execute("SELECT COUNT(*) FROM PersonTable2"); if (db.recordCount == 1 && !db.isEnd) { std::cout << "COUNT(*): " << db.getFiled<sqlite3_int64>(0) << std::endl; } (void)ok;}int main{ testInsertTable; testInsertTable2; return 0;}
Linux x86_64
gcc 4.8, gcc4.9, gcc 5.Windows x86_64
Visual Studio 2015維易PHP培訓(xùn)學(xué)院每天發(fā)布《A SQLite client library written in Modern C++》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/10698.html