sqlite 真·入门小细节
本帖最后由 dahuatttt 于 2013-09-20 03:00:17 编辑 基于以下原因,自己做个超级简单的测试,对于入门的人来说,应该有用:
官方文档总是不能一针见血(官网右上角搜索还总是搜不正确)
满大街互相转载的文章没几个能把下面那些细节用简洁明了的语言说清楚
源代码实在没心情去啃,写个测试就能搞定
这里没有涵盖所有入门内容,见谅。
数据库表格: tttt
字段: 1.id(自增INTEGER) 2.intval(INTEGER) 3.strval(TEXT)
sqlite
#include "sqlite3.h"
int _tmain(int argc, _TCHAR* argv[])
{
sqlite3* db = NULL;
sqlite3_open_v2("test.sqlite", &db, SQLITE_OPEN_READWRITE, NULL);
// 执行下面代码前先手动清空数据库
#define test1
#ifdef test1
sqlite3_exec(db, "INSERT INTO tttt (intval, strval) VALUES (0, 'abc')", NULL, NULL, NULL);
sqlite3_exec(db, "INSERT INTO tttt (intval, strval) VALUES (1, 'def')", NULL, NULL, NULL);
// 看下数据库,一定没问题,妥妥的2条数据
#endif
int result = -1;
sqlite3_stmt * stmt = NULL;
#ifdef test2
sqlite3_prepare(db, "INSERT INTO tttt (intval, strval) VALUES (2, 'abc')", -1, &stmt, NULL);
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
sqlite3_finalize(stmt);
// 看下数据库,一定没问题,妥妥的2条数据
#endif
#define BIND_IDX(STMT, NAME) sqlite3_bind_parameter_index(STMT, NAME)
#ifdef test3
sqlite3_prepare(db, "INSERT INTO tttt (intval, strval) VALUES (@intval, 'abc')", -1, &stmt, NULL);
sqlite3_bind_int(stmt, BIND_IDX(stmt,"@intval"), 33);
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
sqlite3_finalize(stmt);
// 看下数据库,一定没问题,妥妥的2条数据
#endif
#ifdef test4
sqlite3_prepare(db, "INSERT INTO tttt (intval, strval) VALUES (@intval, 'abc')", -1, &stmt, NULL);
sqlite3_bind_int(stmt, BIND_IDX(stmt,"@intval"), 3);
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
//sqlite3_reset(stmt);// 没有这句,表里会出现2条都是3的数据,也就是说下面这句没起作用
sqlite3_bind_int(stmt, BIND_IDX(stmt,"@intval"), 4);
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
sqlite3_finalize(stmt);
// 得出结论: 一旦step过了之后,形成在stmt内部的<sql>将不变,sqlite3_reset之前<sql>不受任何bind语句干扰
#endif
#ifdef test5
char str[4] = {'a', 'b', 'c', '\0'};
sqlite3_prepare(db, "INSERT INTO tttt (intval, strval) VALUES (5, @strval)", -1, &stmt, NULL);
// 下面2句 2选1
sqlite3_bind_text(stmt, BIND_IDX(stmt,"@strval"), str, -1, SQLITE_STATIC);// 数据库里是'bbc'
//sqlite3_bind_text(stmt, BIND_IDX(stmt,"@strval"), str, -1, SQLITE_TRANSIENT);// 数据库里是'abc'
str[0] = 'b';
result = sqlite3_step(stmt);
printf("%d\n", result);// SQLITE_DONE:101
sqlite3_finalize(stmt);
// 得出结论: SQLITE_STATIC就是给了个指针进去, 而SQLITE_TRANSIENT是把指针指向的数据复制到了stmt内部
#endif
#ifdef test6
// 下面4句 4选1
sqlite3_exec(db, "begin transaction", NULL, NULL, NULL);
//sqlite3_exec(db, "begin", NULL, NULL, NULL);
//sqlite3_exec(db, "begin;", NULL, NULL, NULL);
//sqlite3_exec(db, "begin wo cao", NULL, NULL, NULL);
sqlite3_exec(db, "INSERT INTO tttt (intval, strval) VALUES (6, 'abc')", NULL, NULL, NULL);
sqlite3_exec(db, "commit transaction", NULL, NULL, NULL);// 正常插入1条数据
//sqlite3_exec(db, "commit", NULL, NULL, NULL);// 正常插入1条数据
//sqlite3_exec(db, "commit;", NULL, NULL, NULL);// 正常插入1条数据
//sqlite3_exec(db, "commit wo cao", NULL, NULL, NULL);// 正常插入1条数据
// 得出结论: 前面那个词正确就行了!
#endif
sqlite3_close(db);
getchar();
return 0;
}