SQLite编程操作

一、打开/创建数据库的C接口

①sqlite3_open ( const char * filename , sqlite3 ** ppDb )
打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对 象。
②sqlite3_close(sqlite3*)
关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
③const char *sqlite3_errmsg(sqlite3*);
sqlite3_errcode () 通常用来获取最近调用的 API 接口返回的错误代码 .

opensqlite.c

复制代码
#include <stdio.h>
#include <sqlite3.h>

int main(char argc, char **argv)
{
	sqlite3 *db;//句柄
	
	if(argc < 2){
		printf("Usage:%s xxx.db\n",argv[0]);
		return -1;
	}

	if(sqlite3_open(argv[1],&db) == SQLITE_OK){
		printf("open %s success\n",argv[1]);
	}
	sqlite3_close(db);
	printf("done\n");

	return 0;
}

编译:

gcc openlite.c -lsqlite3

运行:

./a.out new.db

结果:因为该目录下没有new.db,所以创建了一个

open返回值:

对返回值及错误的判断:

二、创建表的C接口

①sqlite3_exec(sqlite3*, const char *`sql, sqlite_callback, void *data, char **errmsg)
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
参数说明:
sqlite3:打开的数据库对象
sqlite_callback:一个回调函数
data:作为其第一 个参数
errmsg:将被返回用来获取程序生成的任何错误
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
②int callback(void *arg, int column_size, char *column_value[], char *column_name[])
参数说明:
void *arg:是sqlite3_exec函数的第四个参数
column_size:数据库的字段数
column_value[]:列的值
column_name[]:字段名字

复制代码
#include <stdio.h>
#include <sqlite3.h>

//回调函数
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
    int i;
    printf("arg=%s\n",(char *)arg);

    for(i=0;i<column_size;i++){
        printf("%s = %s\n", column_name[i], column_value[i]);
    }
    printf("=======================\n");
    return 0;//必须返回0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}

int main(char argc, char **argv)
{
    sqlite3 *db;
    char *errorMes = NULL;
    int ret;

    if(argc < 2){
        printf("Usage: %s xxx.db\n",argv[0]);
        return -1;
    }

    if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){
        printf("open %s success\n",argv[1]);
    }else{
        printf("error:%s,%d\n",sqlite3_errmsg(db),ret);
        if(ret == 14){
            printf("permission den\n");
        }
        return -1;
    }

    sqlite3_exec(db, "select * from stu;",callback, "content of sql:",&errorMes);

    sqlite3_close(db);
    printf("done\n");
    return 0;
}

运行结果:

open test.db success

arg=content of sql:

id = 2

name = zhang

score = 99

sex = (null)

=======================

arg=content of sql:

id = 3

name = wang

score = 100

sex = f

=======================

done

C程序创建一个表格,并写入数据

复制代码
#include <stdio.h>
#include <sqlite3.h>

int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
	int i;
	printf("arg=%s\n",(char *)arg);
	for(i=0;i<column_size;i++){
		printf("%s=%s\n",column_name[i],column_value[i]);
	}
	printf("=======================\n");
	return 0;
}

int main(char argc, char **argv)
{
	sqlite3 *db;
	char *errorMes = NULL;
	int ret;
	
	if(argc < 2){
		printf("Usage:%s xxx.db\n",argv[0]);
		return -1;
	}

	if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){
		printf("open %s success\n",argv[1]);
	}else{
		printf("error:%s,%d\n",sqlite3_errmsg(db),ret);
		return -1;
	}
    
    //创建,写入,读取
	sqlite3_exec(db,"create table class01(id Integer,name char,score Integer);",callback,"content of sql:",&errorMes);
	sqlite3_exec(db,"insert into class01 values(23,'wang',100);",callback,"content of sql:",&errorMes);
	sqlite3_exec(db,"select * from class01;",callback,"content of sql:",&errorMes);

	sqlite3_close(db);
	printf("done\n");

	return 0;
}

运行结果:

open test.db success

arg=content of sql:

id=23

name=wang

score=100

=======================

done

相关推荐
先做个垃圾出来………26 分钟前
SQL的底层逻辑解析
数据库·sql
码不停蹄的玄黓39 分钟前
深入拆解MySQL InnoDB可重复读(RR)隔离级别:MVCC+临键锁如何「锁」住一致性?
数据库·mysql·可重复读
paopaokaka_luck1 小时前
基于SpringBoot+Vue的酒类仓储管理系统
数据库·vue.js·spring boot·后端·小程序
薛晓刚2 小时前
哪个领域数据库最难替换?
数据库
芷栀夏2 小时前
基于Anything LLM的本地知识库系统远程访问实现路径
数据库·人工智能
软件2053 小时前
【redis使用场景——缓存——数据淘汰策略】
数据库·redis·缓存
ChinaRainbowSea3 小时前
9-2 MySQL 分析查询语句:EXPLAIN(详细说明)
java·数据库·后端·sql·mysql
时序数据说3 小时前
Java类加载机制及关于时序数据库IoTDB排查
java·大数据·数据库·物联网·时序数据库·iotdb
deeper_wind3 小时前
MySQL数据库基础(小白的“升级打怪”成长之路)
linux·数据库·mysql
加勒比海涛3 小时前
Spring Cloud Gateway 实战:从网关搭建到过滤器与跨域解决方案
数据库·redis·缓存