博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux c++ sqlite3
阅读量:6003 次
发布时间:2019-06-20

本文共 2880 字,大约阅读时间需要 9 分钟。

hot3.png

1,基本信息:

1)#include <sqlite3.h>

2)int rc = sqlite3_open(db_name, &db);//不存在会创建文件

3)查询后直接返回结果 而不是回调

int

sqlite3_get_table (sqlite3 *,   // 打开的数据库对象指针
                   const char * sql, // 要查询的 sql 语句
                   char *** resultp, // 查询结果
                   int * nrow,   // 查询出多少条记录(即查出多少行)
                   int * ncolumn, // 多少个字段(多少列)
                   char ** errmsg  // 错误信息
);

4)sqlite3_close(sqlite3 *db);

5)sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**),  void *, char **errmsg);

int

sqlite3_exec ( sqlite3 *db,  // 使用 sqlite3_open () 打开的数据库对象。
               const char *sql, // 一条待查询的 SQL 语句
               sqlite3_callback, // 自定义的回调函数,对查询结果每一行都执行一次这个函数
               void *,// 这个void 会直接传递到 callback 中的 void 位置;
               char **errmsg//出错信心 可以为空
);

其中sqlite3_callback 是一个 函数指针;

定义为:

typedef int

(*sqlite3_callback) (void *, // 这就是上面函数传递的 void * 参数,需要强制类型转换后才能使用。
                    int, // 查询结果的列数,即有多少个字段数
                    char **, // 保存查询结果
                    char **  // 各个字段的名字
);

6)sqlite3_free_table( dbResult );

2, 对于查询数据 可以使用getTable 也可以使用回调方式的 execute;

3,获取数据库中的表名: 注意 一个db 文件中可能包含多个table(方法待验证)

char 
*szError = NULL,**dbResult;
int 
row,col;
int 
result = sqlite3_get_table( db,
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
,&dbResult,&row,&col,&szError );
if
( result == SQLITE_OK )
{
    
//dbResult就是查询结果,row和col分别是返回结果集的行数(包含表头)和列数
    
sqlite3_free_table(dbResult);
}
else
{
    
//szError是错误描述信息
    
sqlite3_free(szError);
}

4,查询 表中 的 字段名; 已经验证; 网上查到的方法 都存在一些问题,比如当 表 内容为空时,查询字段名称失败;还是通过查看官方文档解决了问题;

sql = "select * from table_name";

    //预处理
    rc = sqlite3_prepare(db, sql, (int)strlen(sql), &stmt, &tail);

    if(rc != SQLITE_OK) {

        fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
    }
    
    //rc = sqlite3_step(stmt); [亲测: no need to step]
    ncols = sqlite3_column_count(stmt);//[tested , got  real count]

    

        //[tested , colum names are printed out]
        for(i=0; i < ncols; i++) {
            fprintf(stderr, "'%s' ", sqlite3_column_text(stmt, i));
        }

        fprintf(stderr, "\n");

        

    
    //释放statement
    sqlite3_finalize(stmt);
    //关闭数据库
  //  sqlite3_close(db); [you can choose not to close]

    return 0;   

5,运行阶段: 环境 macos  XCode ;

编译直接报错;各种sqlite3 函数找不到

猜测是编译链接问题; 果断导入 sqlite3包后 编译成功;

6,刚才(PM 10:31  ,2015.03.16;) 封装的sqlite 工具库 已经调试完成; 插入,删除,更新数据,打印数据都已经成功;

但是目前还是有一点困惑:

1)字段中存在 integer 类型;

2)查询返回值中返回的类型 是 char**

3) 插入语句是 insert into tb_name values ( 5 , 788 , "stt"); 这条语句是 存储在char[]

那么问题来了:

integer 5, 写入到char[]中时候 应该怎么写?

a) 我先使用 int* 砖 char* 方式 ,仍然占用4 个字节 拷贝进来 ,但是 sqlite 报错;

b) 使用int 转字符串 即 5 转为 ‘5’, 方式, 工作正常;

问题是: 我一直认为 在bd 中 的integer 存储的 integer 字段 , 使用的是 如 int 类型 在内存中一样;例如1 ,应当占4个字节,而不是如‘1’ 只占了一个字节;

还请指正我错误的地方。

谢谢;

经过测试,我推测:在查询语句中 的integer 仍然应当使用 相应的ASC码值,而在数据库文件中 仍然将采用整型 数据格式存储。应当是 sqlite 内部对这个做了次封装处理;

NULL: 这个值为空值

VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。

CHAR(n):长度固定为n的字串,n不能超过 254。

INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.

REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.

TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改  变格式。

DATA :包含了 年份、月份、日期。

TIME: 包含了 小时、分钟、秒。

转载于:https://my.oschina.net/u/592116/blog/387497

你可能感兴趣的文章
变更 Linux、Ubuntu 时区、时间
查看>>
高仿QQ空间 侧滑Menu效果且换肤功能《IT蓝豹》
查看>>
mac的git的21个客户端
查看>>
Django之form表单实例
查看>>
Spring Cloud自定义引导属性源
查看>>
OSChina 周日乱弹 ——程序员怎么攒钱买房子!(励志、温情)
查看>>
OSChina 周四乱弹 —— 未来人类的知识宝库
查看>>
mysql树状数据的数据库设计
查看>>
JavaScript快速入门
查看>>
Intger 自动装拆箱
查看>>
html中a连接触发表单提交
查看>>
Linux网卡名改eth0方法
查看>>
SQL or NoSQL——云计算环境中该选择谁
查看>>
托盘气泡很长时间才能消失,uTimeout没起到作用的解决办法
查看>>
利用webshell搭建socks代理
查看>>
nginx+keepalived构建主主负载均衡代理服务器
查看>>
LED灯的闪烁与熄灭也成了一个iptables target,强汗
查看>>
UVA 1169\uvalive 3983 Robotruck 单调队列优化DP
查看>>
我的友情链接
查看>>
POJ 1703 Find them, Catch them
查看>>