CREATE DATABASE soci; CREATE TABLE tb_test ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) DEFAULT '', sex INT DEFAULT 0, UNIQUE KEY name (name) );
| 操作 | 關鍵語法 | 說明 |
|---|---|---|
| 連線 | session sql(backend, conn_str) | 支援 mysql, postgresql, sqlite3, oracle, odbc, firebird |
| 參數綁定 | use(var) (輸入), into(var, ind) (輸出) | indicator 處理 NULL |
| 執行 | sql << "SQL", use(...), into(...) | 流式語法,編譯期檢查 |
| 事務 | transaction tr(sql); tr.commit()/rollback() | RAII 風格 |
session sql(mysql, "host=localhost db=soci user=dantezhu");
indicator ind;
string name = "dandan";
int sex;
sql << "SELECT sex FROM tb_test WHERE name = :name", into(sex, ind), use(name);
if (ind == i_ok) { /* 成功 */ }
int count; sql << "SELECT COUNT(*) FROM tb_test", into(count, ind); vectornames(count); vector sexes(count); sql << "SELECT name, sex FROM tb_test WHERE sex = :sex", into(names), into(sexes), use(1);
struct Person { int id; string name; int sex; };
namespace soci {
template<> struct type_conversion {
typedef values base_type;
static void from_base(values const& v, indicator, Person& p) {
p.id = v.get("id");
p.name = v.get("name");
p.sex = v.get("sex");
}
static void to_base(const Person& p, values& v, indicator& ind) {
v.set("id", p.id); v.set("name", p.name); v.set("sex", p.sex);
ind = i_ok;
}
};}
Person p; sql << "SELECT id, name, sex FROM tb_test WHERE name = :name", into(p, ind), use(name);
Person p = {0, "niuniu", 2};
sql << "INSERT INTO tb_test(name, sex) VALUES(:name, :sex)", use(p);
affected_rows() 無法直接獲取(需自行查詢)LAST_INSERT_ID() 查詢template<> 寫法需注意命名空間原文代碼:vimercode/soci_test