数据库函数接口

perror ("biubiu") 用来将上一个函数发生错误的原因 + "biubiu" 输出到标准设备(stderr)。
函数原型:
void perror ( const char * str );
perror_my(ret,"bind");
void perror_my(int ret,char *p)
{
if(xxx == ret)
{
perror(p);
exit(-1);
}
}
或者
strerror //#include <string.h>
// char* strerror( int errnum);
通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,
strerror_my(ret,"xxxx")
void strerrpr_my(int ret,char *str)
{
if(xxx == ret)
{
fprintf(stderr,"%s\n"strerror( errno )); // #include <errno.h>
exit(-1);
}
}
 
gcc xx.c -o xx -lsqlite3
#include <sqlite3.h>
 
打开数据库的API如下:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能: 打开数据库。
这里会引入一个非常复杂的sqlite3的数据结构。这个根据需要以后酌情了解些。
 
打开数据库除了这种形式意外,还有sqlite3_open、sqlite3_open16、sqlite3_open_v2几种形式,基本上类似。
 
关闭sqlite数据库
int sqlite3_close(sqlite3 *db);
功能: 关闭sqlite数据库
返回值:成功返回SQLITE3_OK,失败返回错误码
 
返回错误信息
const char *sqlite3_errmsg(sqlite3 *db);
返回值: 返回错误信息
 
大部分sql操作都可以通过sqlite3_exec来完成,它的API形式如下:
int sqlite3_exec(
sqlite3*, /* An open database */ sqlite3描述的是数据库句柄
const char *sql, /* SQL to be evaluated */ sql 要执行的SQL语句
int (*callback)(void*,int,char**,char**), /* Callback function */ callback回调函数
void *, /* 1st argument to callback */ void *回调函数的第一个参数
char **errmsg /* Error msg written here */ errmsg错误信息,如果没有SQL问题则值为NULL
);
 
 
回调函数:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,
当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
 
回调函数式一个比较复杂的函数。它的原型是这样的:
int callback(void *params,int column_size,char **column_value,char **column_name)
int callback(void *params,int column_size,char *column_value[],char *column_name[])
每一个参数意义如下:
  1. params是sqlite3_exec传入的第四个参数
  2. column_size是结果字段的个数
  3. column_value是返回记录的一位字符数组指针
  4. column_name是结果字段的名称
 
通常情况下callback在select操作中会使用到,尤其是处理每一行记录数。返回的结果每一行记录都会调用下“回调函数”。
如果回调函数返回了非0,那么sqlite3_exec将返回SQLITE_ABORT,并且之后的回调函数也不会执行,同时未执行的子查询也不会继续执行。
 
对于更新、删除、插入等不需要回调函数的操作,sqlite3_exec的第三、第四个参数可以传入0或者NULL。
 
通常情况下sqlite3_exec返回SQLITE_OK=0的结果,非0结果可以通过errmsg来获取对应的错误描述。
 
sql操作也可以通过sqlite3_exec来完成,它的API形式如下:
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results written to a char *[] that points to*/
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
void sqlite3_free_table(char **result); 组合使用
 
参数具体说明:
  1. 第1个参数不再多说,看下面例子。
  2. 第2个参数是sql 语句,跟sqlite3_exec 里的sql 是一样的。是一个很普通的以\0结尾的char*字符串。
  3. 第3个参数是查询结果,它依然一维数组(指针数组)(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:字段名称,后面是紧接着是每个字段的值。下面用例子来说事。不能为NULL
  4. 第4个参数是查询出多少条记录(即查出多少行,不包括字段名那行)。
  5. 第5个参数是多少个字段(多少列)。
  6. 第6个参数是错误信息,跟前面一样,这里不多说了。
 
get_table是 根据查询到的信息来创建相应空间的(函数内部自己创建),第二个参数是传命令的!!
这样就不会无法确定malloc大小了
free_table释放空间是值传递
pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),因为前(*pnColumn)个是字段名
(行+1)*(列)
gettable 获取数据内存分布
内存分布:
字段名1
字段名2
字段名3
……
-------------
字段名1 -> 值1
字段名2 -> 值1
字段名3 -> 值1
……
--------------
字段名1 -> 值2
字段名2 -> 值2
字段名3 -> 值2
……
--------------
字段名1 -> 值3
字段名2 -> 值3
字段名3 -> 值3
……
从第0索引到第ncolumn-1索引都是字段的名称
从第ncolumn索引开始,后面都是字段的值
 
释放sqlite3_malloc或者是sqlite3_realloc的空间
void sqlite3_free(void*);
功能: 用于释放sqlite3_malloc或者是sqlite3_realloc的空间
函数参数 void * 指向需要释放空间的首地址
 
全部代码实现:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
 
int callback(void *p, int column_sise, char **column_value, char **column_name);
int main(int argc, const char **argv)
{
sqlite3 *db;
int ret;
char sql[1024] = "\0";
char *errmsg;
int value = 0;
//打开或创建数据库
ret = sqlite3_open("test.db", &db);
if(SQLITE_OK != ret)
{
fprintf(stderr, "sqlite3_open : %s\n", sqlite3_errmsg(db));
return -1;
}
//建表
sprintf(sql, "create table if not exists student (name text, id integer, score real);");
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(SQLITE_OK != ret)
{
fprintf(stderr, "create table failed : %s\n", errmsg);
fprintf(stderr, "create table failed : %s\n", sqlite3_errmsg(db));
}
#if 1
//插入数据
memset(sql, '\0', sizeof(sql));
sprintf(sql, "insert into student (name, id, score) values (\"%s\", %s, %s);", argv[1], argv[2], argv[3]);
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(SQLITE_OK != ret)
{
fprintf(stderr, "insert into failed : %s\n", errmsg);
return -1;
}
#endif
//查询数据
memset(sql, '\0', sizeof(sql));
sprintf(sql, "select * from student;");
ret = sqlite3_exec(db, sql, callback, &value, &errmsg);
if(SQLITE_OK != ret)
{
fprintf(stderr, "insert into failed : %s\n", errmsg);
return -1;
}
 
 
//关闭数据库
sqlite3_close(db);
return 0;
}
 
int callback(void *p, int column_sise, char **column_value, char **column_name)
{
int i;
printf("%d\n", ++(*((int *)p)));
for(i = 0; i < column_sise; i++)
{
printf("%-8s\t", column_name[i]);
}
printf("\n");
for(i = 0; i < column_sise; i++)
{
printf("%-8s\t", column_value[i]);
}
printf("\n");
return 0;
}
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值