linux c++ sqlite3

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: 包含了 小时、分钟、秒。


你可能感兴趣的:(linux c++ sqlite3)