C语言连接数据库首先我们需要有数据库,所以我们需要创建数据库,
在linux环境下进入sqlite3模式下,顺便在后面写上数据库名:
在这里插入图片描述
首先定义一个数据库指针类型,然后调用数据库的接口函数:sqlite3_open(“数据库名”,指针地址)”函数功能:打开一个数据库,如果这个数据库文件不存在,则自动创建,打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。并且让上面定义的指针指向这个数据库。ret 变量是用来接收这个接口函数的返回值,这个函数的返回值是SQLITE_OK 它的值也就是0,表示打开成功,如果不是,那么就要报错。下面对其进行判断在这里插入图片描述
到这里我们数据库打开就操作完成了,后面就开始在数据库中创建表,因为没有表数据往哪里插呢,好,来创建数据库中的table。在这里插入图片描述
这里是对创建表函数的返回值的一个判断,如果返回值不是SQLITE_OK那么就会导致表创建不成功。
在这里插入图片描述
上图是创建表函数,函数参数是传递指向数据库的指针,红色标记 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:错误信息

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

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

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

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

//调用数据库接口API


//创建表
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);

    //将id和name打印在字符串,保存在sql中
    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;
    }
   /* else
    {
        return SQLITE_OK;
    }*/

    return SQLITE_OK;
}

//回调函数,函数名和参数的名可变,但是返回值类型,参数类型,参数数量和位置不能变。
//回调函数  1回调函数中第四个参数     2表的列数
//          3指向查询结果的指针数组   4指向表头名的指针数组
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;       //接sqlite3_open()函数的返回值

    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;
}


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐