首页 > 数据库 >c语言操作sqlite

c语言操作sqlite

时间:2024-02-13 21:44:54浏览次数:22  
标签:sqlite 语言 int res db stmt sqlite3 操作 NULL

前言

c语言只需要下载sqlite.dll即可操作数据库,qt sql只是对sqlite的api做了一层驱动包装而已

下载 

 

 

 

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include "sqlite3.h"

void sqlite3_test_get_table(sqlite3 *db)
{
char **rows = NULL;
int nrow = 0, ncolumn = 0;
int res = sqlite3_get_table(db, "select id, name from stu order by id", &rows, &nrow, &ncolumn, NULL);
if (res != SQLITE_OK) {
char err[1024] = { 0 };
snprintf(err, sizeof err, sqlite3_errmsg(db));
printf("sqlite3_prepare_v2 error: %s\n", err);
return;
}
printf("获取到%d条数据,列数量为: %d\n", nrow, ncolumn);

for (int i = 0; i <= nrow; i++) {
for (int j = 0; j < ncolumn; j++) {
printf("%s\t", rows[i * ncolumn + j]);
}
printf("\n");
}
sqlite3_free_table(rows);
}

void sqlite3_test_update(sqlite3 *db)
{
sqlite3_exec(db, "begin", NULL, NULL, NULL);
sqlite3_stmt *stmt = NULL;
const char *sql = "select id,name,age from stu order by id asc";
const char *err = NULL;
int res = sqlite3_prepare_v2(db, sql, -1, &stmt, &err);
assert(res == SQLITE_OK);
printf("%s\n", sql);
while (sqlite3_step(stmt) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const char *name = (const char *)sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2) + 1;
printf("%d\t%s\t%d\n", id, name, age);

char sql[1024];
snprintf(sql, sizeof sql, "update stu set age = %d where id = %d;", age, id);
res = sqlite3_exec(db, sql, NULL, NULL, NULL);
assert(res == SQLITE_OK);
}
sqlite3_exec(db, "commit", NULL, NULL, NULL);

sqlite3_finalize(stmt);
}

void sqlite3_test_insert(sqlite3 *db)
{
sqlite3_stmt *stmt;
const char *sql = "insert into stu (name, age) values (?, ?)";
const char *names[] = {"凡蕾", "幻灵", "紫安"};
int ages[] = {15, 18, 23};
int res = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (res != SQLITE_OK) {
printf("sql prepare error: %s\n", sql);
return;
}
sqlite3_exec(db, "begin", NULL, NULL, NULL);
for (int i = 0; i < 3; i++) {
sqlite3_bind_text(stmt, 1, names[i], -1, NULL);
sqlite3_bind_int(stmt, 2, ages[i]);

res = sqlite3_step(stmt);
if (res != SQLITE_DONE) {
printf("insert error. res = %d. name: %s age: %d\n", res, names[i], ages[i]);
break;
}
printf("insert success. name: %s age: %d\n", names[i], ages[i]);

sqlite3_reset(stmt);
}
sqlite3_exec(db, "commit", NULL, NULL, NULL);
sqlite3_finalize(stmt);
}

int main(int argc, char const *argv[])
{
sqlite3 *db = NULL;
int res = sqlite3_open("sqlite3test.db", &db);
if (res != SQLITE_OK) {
printf("open database sqlite3test.db fail!\n ERR: %s\n", sqlite3_errmsg(db));
return -1;
}
printf("open database sqlite3test.db ok!\n");

sqlite3_test_get_table(db);

sqlite3_close(db);
return 0;
}

标签:sqlite,语言,int,res,db,stmt,sqlite3,操作,NULL
From: https://www.cnblogs.com/jk0011/p/18014849

相关文章

  • m基于Faster-RCNN网络的人员摔倒检测系统matlab仿真,带GUI操作界面
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要2.1、Faster-RCNN网络介绍          Faster-RCNN是一种流行的深度学习目标检测算法,它通过使用RegionProposalNetwork(RPN)来实现高效且准确的目标检测。相比于其它的目标检测算法,例......
  • day06_文件管理操作练习
    作业解析关于[email protected]关于登录,退出登录1.登录的概念的第一种形式1.比如你登录系统[email protected]#退出该会话登录exit#退出登录2.第二种登录,如用于切换,root>yuchao01验证该用户是否存在系......
  • day04_操作系统入门
    今日笔记学操作系统基础概念linux系统linux系统(centos)+vmware安装起来(网络配置,磁盘分区)ubuntu安装xshell服务器的远程连接服务器网站的前后端,数据库app的前后端,数据库微信、腾讯微信的服务器移动端设备上,安装的微信客户端在线笔记笔记对运维来说,就是一个宝藏,mar......
  • Go语言精进之路读书笔记第25条——了解变长参数函数的妙用
    25.1什么是变长参数变长参数函数:调用时可以接受零个、一个或多个实际参数的函数。funcPrintln(a...interface{})(nint,errerror)只能有一个“...T”类型形式参数,且该形式参数应该为函数参数列表中的最后一个形式参数。“...T”类型形式参数在函数内呈现为[]T类型的变......
  • Python语言程序设计入门教程
      目  录第一章、概述    1.Python是什么    2.Python语言的特点    3.Python语言的缺点    4.Python程序的执行过程10   5.安装Python11  6.运行Python程序17        7.Python集成开发环境21  第二章、......
  • Go语言精进之路读书笔记第24条——方法集合决定接口实现
    24.1方法集合方法决定接口实现:如果某个自定义类型T的方法集合是某个接口类型的方法集合的超集,那么就说类型T实现了该接口,并且类型T的变量可以赋值给该接口类型的变量Go语言规范,对于非接口类型的自定义类型T:类型T,方法集合由所有receiver为T类型的方法组成类型*T,方法集合由所......
  • Go语言精进之路读书笔记第23条——理解方法的本质以选择正确的receiver类型
    和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。receiver参数是方法与类型之间的纽带。Go方法特点:方法名的首字母是否大写决定了该方法是不是导出方法。方法定义要与类型定义放在同一个包内。由此可以推出,不能为原生类型(如int/float64/map等)添加......
  • Go语言精进之路读书笔记第22条——使用defer让函数更简介、更健壮
    22.1defer的运行机制在Go中,只有在函数和方法内部才能使用defer。defer关键字后面只能接函数或方法,这些函数被成为deferred函数。defer将它们注册到其所在goroutine用于存放deferred函数的栈数据结构中。在执行defer的函数退出前,按后进先出(LIFO)的顺序调度执行。22.2defer的......
  • Go语言精进之路读书笔记第21条——让自己习惯于函数是"一等公民"
    21.1什么是"一等公民"(1)正常创建//$GOROOT/src/fmt/print.gofuncnewPrinter()*pp{p:=ppFree.Get().(*pp)p.panicking=falsep.erroring=falsep.wrapErrs=falsep.fmt.init(&p.buf)returnp}(2)在函数内创建,定义匿名函数赋值给......
  • Go语言精进之路读书笔记第20条——在init函数中检查包级变量的初始状态
    20.1认识init函数init函数的特点:运行时调用,Go程序中不能显式调用顺序执行,等待一个init函数执行完毕并返回后再执行下一个init函数在整个Go程序生命周期内仅会被执行一次先被传递给Go编译器的源文件中的init函数先被执行,同一个源文件中的多个init函数按声明顺序依次执行。但......