C语言操作数据库(SQLite3)调用接口函数

C语言连接数据库首先我们需要有数据库,所以我们需要创建数据库,
在linux环境下进入sqlite3模式下,顺便在后面写上数据库名:

C语言操作数据库(SQLite3)调用接口函数
首先定义一个数据库指针类型,然后调用数据库的 接口函数:sqlite3_open(“数据库名”,指针地址)”函数功能:打开一个数据库,如果这个数据库文件不存在,则自动创建,打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。并且让上面定义的指针指向这个数据库。ret 变量是用来接收这个接口函数的返回值,这个函数的返回值是SQLITE_OK 它的值也就是0,表示打开成功,如果不是,那么就要报错。下面对其进行判断C语言操作数据库(SQLite3)调用接口函数
C语言操作数据库(SQLite3)调用接口函数
这里是对创建表函数的返回值的一个判断,如果返回值不是SQLITE_OK那么就会导致表创建不成功。
C语言操作数据库(SQLite3)调用接口函数
上图是创建表函数,函数参数是传递指向数据库的指针,红色标记 1 所在的字符串是创建表的sql语句,这里加了这三个单词,是为了往后再执行这个代码时不会报这个表已经存在的错,这句话就是说,创建mytable的表,如果表存在就不创建了,就用就好了,如果不存在就创建。红色标记 2 是调用数据库接口函数,这个函数可以做好几件事。
该函数接口原型是:
int sqlite3_exec(sqlite3 db, const char sql, sqlite3_callback callback, void ,char errmsg);
db:调用的数据库
sql:sql语句
callback:回调函数,每成功执行一次sql语句就执行一次callback函数
void
:给回调函数传的参数(这里当需要使用时,需要进行强制类型转换)
errmsg:错误信息

上面创建数据库和创建表都完成后,后面就要开始插入数据操作了,这里注意哈,插入时要和上一步在创建表时的字段名顺序要一样。

C语言操作数据库(SQLite3)调用接口函数
上图的sql 定义的是数组,而在创建表时sql定义的是一个字符指针,注意这两个用法不一样虽然代表的都是sql语句,创建表的那个是直接指向sql语句,其实就是指向字符串的首地址,这里sql是用在sprintf()函数里面的。这个函数是将第三个参数,放到第二个参数里面,然后再将第二个参数放到第一个参数里面,所以这里需要用数组来接这一串字符,这是为什么要这一步操作,是因为这一步我们要将我们自己要输入的数据输入进去,所以这一步是必要的。
后面也用到接口函数sqlite3_exec()函数,这个函数可用于创建表,插入数据,删除数据,显示数据
这里作用和创建表差不多,就是在这个数据库中插入数据,如果成功就进行下一步,如果不成功返回错误信息。

后面插入完成就可以进行查看,看下图:

C语言操作数据库(SQLite3)调用接口函数
上图显示表中数据就要用到回调函数那个参数了,这里的display就是回调函数,后面的(void )&flag是给回调函数用的,这里取地址是因为这里要改变flag的值,所以传地址过去,这个回调函数看下图:C语言操作数据库(SQLite3)调用接口函数
这里回调函数就是要显示输出table中的数据。
C语言操作数据库(SQLite3)调用接口函数
这里和上面用到的差不多,sql语句变化了,再改一些提示
下面是使用sqlite3_get_table()函数接口
C语言操作数据库(SQLite3)调用接口函数
我们要使用的是sqlite_get_table()函数的原型是:
int sqlite3_get_table(
sqlite3
db, //打开的数据库的句柄
const char zSql, //要执行的SQL语句
char _
pazResult, //结果写入该指针指向的char_
int
pnRow, //结果集中行的数目
int pnColumn, //结果集中列的数目
char
*pzErrmsg //错误信息
);

再对其进行输出显示操作。
好了,差不多就这么多,结束。把源码贴上。

#include
#include
#include

int create_table(sqlite3 *pdb)
{
    char *sql = NULL;
    char *errmsg = NULL;
    int ret;

    sql = "create table if not exists mytable (id integer primary key,name text);";

    ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);

    if(SQLITE_OK != ret)
    {
        printf("create table error! %s\n",errmsg);
        return -1;
    }
    else
    {
        return SQLITE_OK;
    }
}

int insert_record(sqlite3 *pdb)
{
    char sql[100];
    char *errmsg = NULL;
    int ret;
    int id;
    char name[20];

    printf("please input id and name: \n");

    scanf("%d",&id);
    scanf("%s",name);

    sprintf(sql,"insert into mytable (id,name) values (%d,'%s');",id, name);

    ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);

    if(SQLITE_OK != ret)
    {
        perror("insert error!");
        printf("insert record 1 error! %s\n",errmsg);
        return -1;
    }

    return SQLITE_OK;
}

int display(void *para, int ncol, char *col_val[], char **col_name)
{
    int i;
    int *flag = NULL;

    flag = (int *)para;

    if(0 == *flag)
    {
        *flag = 1;

        printf("column number is: %d\n", ncol);

        for(i = 0; i < ncol; i++)
        {
            printf("%10s",col_name[i]);
        }

        printf("\n");
    }

    for(i = 0; i < ncol; i++)
    {
        printf("%10s",col_val[i]);
    }

    printf("\n");

    return 0;
}

int inquire_uscb(sqlite3 *pdb)
{
    char *sql = NULL;
    char *errmsg = NULL;
    int ret;
    int flag = 0;

    sql = "select * from mytable;";

    ret = sqlite3_exec(pdb,sql,display,(void *)&flag,&errmsg);

    if(SQLITE_OK != ret)
    {
        printf("select error! %s\n",errmsg);

        return -1;
    }
    else
    {
        return SQLITE_OK;
    }

}

int delete_record(sqlite3 *pdb)
{
    char sql[100];
    char *errmsg = NULL;
    int ret;
    int id;

    printf("please input delete id:\n");
    scanf("%d",&id);

    sprintf(sql,"delete from mytable where id = %d;", id);

    ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);

    if(SQLITE_OK != ret)
    {
        printf("delete error! %s\n",errmsg);

        return -1;
    }
    else
    {
        return SQLITE_OK;
    }
}

int inquire_nocb(sqlite3 *pdb)
{
    char *sql = NULL;
    char ** ret_val = NULL;
    char *errmsg = NULL;
    int nrow;
    int ncol;
    int ret;
    int i;

    sql = "select * from mytable";

    ret = sqlite3_get_table(pdb, sql, &ret_val, &nrow, &ncol, &errmsg);

    if(SQLITE_OK == ret)
    {
        printf("nrow = %d ncol = %d\n",nrow,ncol);

        for(i = 0; i < (nrow + 1)* ncol; i++ )
        {
            printf("%10s",ret_val[i]);

            if((i + 1) % ncol == 0)
            {
                printf("\n");
            }
        }
    }
    else
    {
        sqlite3_free_table(ret_val);

        return -1;
    }

     sqlite3_free_table(ret_val);
}

int main(int argc, char **argv)
{
    sqlite3 *pdb;
    int ret;

    ret = sqlite3_open("mydatabase.db",&pdb);

    if(ret != SQLITE_OK)
    {

        printf("open database fail! %s\n",sqlite3_errmsg(pdb));
        exit(1);
    }
    else
    {
        printf("open database successfully!\n");
    }

    if(SQLITE_OK == create_table(pdb))
    {
        printf("create table success!\n");
    }
    else
    {
        sqlite3_close(pdb);
        return 0;
    }

    if(0 != insert_record(pdb))
    {
        sqlite3_close(pdb);
        exit(-1);
    }

    inquire_uscb(pdb);

    delete_record(pdb);

    inquire_nocb(pdb);

    sqlite3_close(pdb);

    return 0;
}

Original: https://blog.csdn.net/weixin_43296982/article/details/123176025
Author: 冬雪如春
Title: C语言操作数据库(SQLite3)调用接口函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815308/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球