linux下C语言编程操作数据库 sqlite3

1、安装数据库

我们从SQLi官网下载页面 https://www.sqlite.org/download.html 从源代码区下载 sqlite-autoconf-*.tar.gz。
然后在 Linux 下安装sqlite3

第一步:安装

第二步: 解压

第三步: 进入蓝色文件夹

第四步: ./configure(配置安装)

第五步: make (编译)

第六步: sudo make install (开始安装)

第七步: 安装成功

2、sqlite的相关函数

  • sqlite3_open()

函数原型:

#include <sqlite3.h>

int sqlite3_open(const char *dbname,sqlite3 **db)

函数说明:用来打开一个数据库

参数说明: 第一个参数dbname是数据库的名称;
第二个参数db是用于保存打开的数据库文件dbname的信息。
  • sqlite_close()

函数原型:

#include <sqlite3.h>

int sqlite3_close(sqlite3  *db)

函数说明:用来关闭一个数据库。
参数说明:db需要关闭的数据库文件。
  • sqlite3_exec()

函数原型:

#include <sqlite3.h>

int sqlite_exec(sqlite  *db, const char *sql, int (*callback)(void *int,char **,char **),void *,char **errmsg);

函数说明:  用来执行sqlite3语句
参数说明:  第一个参数:db是用于保存打开的数据库文件dbname的信息;
第二个参数:  sql你要执行命令的语句;
第三个参数:  callback回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数。通常设为NULL;
第四个参数:  void *是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
第五个参数:  是错误信息。
说明:通常 sqlite3_callback和它后面的void*这两个位置都可以填NULL 。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select查询。这可以通过sqlite3_get_table 函数做到。
  • sqlite3_get_table()

函数原型:

#include <sqlite3.h>

int sqlite3_get_table(sqlite3 *db, const char *zsql,char ***pazResult, int *nrow, int *ncolumn,char **zErrmsg);
函数说明:   执行sql的查询功能
参数说明:   第一个参数db:db是用于保存打开的数据库文件dbname的信息;
第二个参数:  sqlite3的语句,跟sqlite3_exec里的sql是一样的,是一个很普通的以\0结尾的char *字符串。
第三个参数: 查询的结果,它依然是一维数组,他的内存布局时:字段名称,后面时紧接着是每个字段值。
第四个参数: 是查询出多少条记录(即查出是多少行,不包括字段名那行)
第五个参数: 是多少个字段(多少列)
第六个参数: 是错误信息
注意:如果提供了errmsg,用来创建错误消息的内存是在堆上分布的,故在调用后,应该检查一下是否为null值, 如果有错误发生,使用sqlite3_free()释放errmsg占用的内存

3、代码示例

  • 创建一个数据库

示例代码:

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


int main (int argc, char **argv)
{
    sqlite3   *db = NULL;
    int data  = -1;

  //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件

    data = sqlite3_open("test.db",&db);
    if(data < 0)
    {
        printf("create testsqlite failure:%s\n",sqlite3_errmsg(db)); //创建失败
        return -1;
    }
    else
     {
        printf("create testsqlite successfuly\n");  //创建成功
        sqlite3_close(db);//关闭数据库
        return 0;
    }
}

执行结果:

  • 需要注意的时在编译时需要在末尾加上一个 -lsqlite3,不然会抛错。

  • ls 查看目录多了刚命名的数据库 test.db

  • 插入数据

示例代码:

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

int main (int argc, char **argv)
{
    sqlite3 *db = NULL;
    int data = -1;
    char *msg=0;
    char  *sql;

//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件

    data = sqlite3_open("test.db",&db);
    if(data < 0)
    {
        printf("create testsqlite failure:%s\n",sqlite3_errmsg(db));
        return -1;
    }

    else
    {
        printf("create testsqlite successfuly\n");
    }
    sql = "CREATE TABLE stu(ID number, name, age );";
    sqlite3_exec(db, sql, 0, 0,&msg);
    //以下为添加数据
    sql = "INSERT INTO stu VALUES('1','huang','100');";
    sqlite3_exec(db, sql, 0, 0,&msg);
    sql = "INSERT INTO stu VALUES('2','chen','90');";
    sqlite3_exec(db, sql, 0, 0,&msg);

    printf("Insert successfuly\n");

    sqlite3_close(db);//关闭数据库
    return 0;
}

执行结果:

  • 创建了一个 stu 的一个表

  • sqlite3 test.db 进入我们创建的数据库中 ,在sqlite->中输入select *from stu之后就会出现我们刚才往表里插入的内容

  • 查看表的内容

示例代码:

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


int main (int argc, char **argv)
{
    sqlite3 *db = NULL;
    int  data;
    char *msg=0;
    int row=0,column=0;  //行   列
    char **Result=NULL;   //结果
    char  *sql;
    //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件

    data = sqlite3_open("test.db",&db);
    if(data)
    {
        printf("create testsqlite failure:%s\n",sqlite3_errmsg(db));
        exit(1);
    }

       printf("create testsqlite successfuly\n");


    sql ="SELECT *FROM stu";

    data =sqlite3_get_table(db, sql, &Result, &row, &column,&msg);


    if(data ==0 )
    {
        printf("row:%d column=%d \n", row , column);

        printf("the result of querying is:\n");

        int i=0,j=0;

        for (i=0; i< (row+1) *column; i++)
        {
        
            printf("%s", Result[i]);
            printf("\n");
        }

    }
    else if(data)
    {
        printf("SQL error!:%s\n",msg);//打印错误信息
        sqlite3_free(msg);//释放掉azResult的内存空间
    }
    sqlite3_close(db);//关闭数据库
    return 0;
}

执行结果:

  • 删除数据

示例代码:

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


int main (int argc, char **argv)
{
    sqlite3  *db=NULL;
    int  data;
    char *msg=0;
    char  *sql;
    char  *data1;
 
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
     data = sqlite3_open("test.db",&db);
    if(data)
    {
        printf("create tetssqlite failure:%s\n",sqlite3_errmsg(db));
        exit(1);
    }

     printf("create testsqlite successfuly\n");



    sql ="DELETE FROM stu";

    data=sqlite3_exec(db,sql,NULL,(void *)data1,&msg);
     if(data)
     {
        printf("SQL error!:%s\n",msg);//打印错误信息
        sqlite3_free(msg);//释放掉zerrmsg的内存空间
     }
     else
     {
         printf("delete recodes successfuly\n");
     }
    sqlite3_close(db);//关闭数据库
    return 0;
}


执行结果:

  • 打开sqlite3创建的表 test.db表中 (数据不见了)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值