贡献者: addis
ubuntu 上用 sudo apt install libsqlite3-dev
安装
另外安装命令行工具 sudo apt install sqlite3
参考这里。注意所有的数据必须先转换成字符串才能加到数据库中。
#include <iostream>
#include <sqlite3.h>
void test_sqlite()
{
using namespace slisc;
#ifdef SLS_USE_SQLITE
sqlite3* DB;
int exit;
file_remove("example.db");
exit = sqlite3_open("example.db", &DB);
if (exit) {
cout << sqlite3_errmsg(DB) << endl;
SLS_ERR("Error open DB!");
}
char* messaggeError;
string sql = "CREATE TABLE PERSON("
"ID INT PRIMARY KEY NOT NULL, "
"NAME TEXT NOT NULL, "
"SURNAME TEXT NOT NULL, "
"AGE INT NOT NULL, "
"ADDRESS CHAR(50), "
"SALARY REAL );";
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if (exit != SQLITE_OK) {
SLS_ERR("Error Create Table");
sqlite3_free(messaggeError);
}
sql = "INSERT INTO PERSON"
"(ID, NAME, SURNAME, AGE, ADDRESS, SALARY)"
" VALUES "
"(0, 'Addis', 'Chen', 30, 'ABC Rd,
Manhattan, NY, 12345', 1500.03);"
"INSERT INTO PERSON"
" VALUES "
"(1, 'Bob', 'Chen', 31, 'DEF Ave,
Manhattan, NY, 12345', 4500.03);";
exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
if (exit != SQLITE_OK) {
SLS_ERR("Error Inserting Table :" + Str(messaggeError));
sqlite3_free(messaggeError);
}
sqlite3_close(DB);
#else
cout << "---------- disabled! ----------" << endl;
#endif
}
另一个挺有用的小程序是(修改自官方教程),可以在命令行对任意数据库文件执行任意 SQL 命令。编译:g++ -o sqcmd sqcmd.cpp -l sqlite3
。使用方法如 ./sqcmd example.db "SELECT * FROM PERSON"
#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **col_name){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", col_name[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char **argv){
sqlite3 *db;
char *zErrMsg = 0;
int ret;
if( argc!=3 ){
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
return(1);
}
ret = sqlite3_open(argv[1], &db);
if( ret ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return(1);
}
ret = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if( ret!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
sqlite3 的数据库文件是二进制的,可以用 sqlite3
命令行 dump 出一个通用的文本文件
sqlite> .output example.sql
sqlite> .dump
sqlite> .exit
当然也不需要把所有数据类型都转换成 string 那么蠢。这就要用到 binding,参考这里。
sqlite3_exec()
命令是调用一系列命令,如果用 binding,就必须把它们分开用。
sqlite3_stmt stmt;
创建一个 statement object。
str
parse 为 stmt
:ret = sqlite3_prepare_v2(db, str.c_str(), str.size()+1, &stmt, NULL);
。这里 str
中的数据可以用 ?
或者 ?编号
代替,以后再 bind 到不同的数据上。这样就不需要每换一次数据都要重新 parse 一次。
int sqlite3_bind_parameter_count(stmt)
可以返回 ?
的个数。
ret = sqlite3_bind_text(stmt, 问号的编号, names[i].c_str(), names[i].size(), SQLITE_STATIC);
用于把字符串 bind 到指定的问号上。如果问号没有指定编号则从左到右从 1 开始。
ret = sqlite3_bind_text(stmt, 问号的编号, int);
用于把整数 bind 到指定的问号上。
ret = sqlite3_step(stmt)
来执行,当 statement 不是 query 时返回 SQLITE_DONE
;是 query 时返回 SQLITE_ROW
,每调用一次返回一行。
sqlite3_column_int(stmt, 从0开始的列编号)
获取当前返回行的某个整数类型的列
(char*)sqlite3_column_text(stmt, 从0开始的列编号)
同理获得字符串类型
sqlite3_finalize(stmt);
释放内存。
sqlite3
是一个命令行程序,可以手动输入 SQL 命令来操作 sqlite 数据库。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利