SQLite笔记-基本命令-c语言的使用

2023-11-10

一、数据库介绍

1、数据库的基本概念

数据

能够输入计算机并能被计算机程序识别和处理的信息集合

数据库

数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

2、常用的数据库

1)大型数据库

1)oracle公司是最早开发数据库的厂商之一,目前oracle关系数据卡产品的市场占有率名列前茅。
2)IBM的DB2是第一个具备上网功能的多媒体关系数据库管理系统,支持linux在内的一系列平台

2)中型数据库

server是微软开发的数据库,主要支持windows

3)小型数据库

mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun收购,开放源码。后面Sun被oracle收购

3、基于嵌入式的数据库

1)基于嵌入式linux的数据库有SQLite,Firebird,BerkeleyDB,eXtremeDB
2)Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容
3)SQLite关系型数据库,体积小,支持ACID事务。(不支持严格的数据类型检测)
4)BerkeleyDB没有数据库服务器概念,它的程序直接连接到应用程序中
5)eXtremeDB是内存数据库,运行效率高

4、SQLite基础

SQLite的源代码是c,其源代码完全开放,SQLite第一个Alpha版本诞生于2005年5月,他是一个轻量级的嵌入式数据库。

SQLite以下特性

-零配置-无需安装和管理配置
-储存在单一的磁盘文件中的一个完整的数据库
-数据库文件可以在不同字节顺序的机器间自由共享
-支持数据库大小至2TB
-足够小,全部源码大致3w的c代码,250kb
-比目前流行的大多数数据库的操作要快

二、SQLite的安装

1.在线安装
sudo apt-get install sqlite3

2.SQLite的基本命令

sqlite3 student.db 创建一个学生数据库

3.系统命令

以.开头的命令为系统命令
.help 帮助
.quit 退出
.exit 退出
.schema 查看表的结构图
.databases 查看打开的数据库
.table 查看表格

4.sql命令

1)基本的sql命令,不以.开头,以;结尾
2)创建一张数据库表stu
create table stu(id Integer , name char , score Integer);
3)插入一条记录
insert into stu values(1001,'zhangsan',80); //所有字段都有插入
insert into stu (name, score)values(1003,"wangwu"); //部分字段插入操作
4)查询记录
select * from stu; //查询所有字段
select name,score from stu; //查询部分字段
select * from stu where score=80 and id =1001; //按条件查询 and
select * from stu where score=80 or id =1001; //按条件查询 or
5)删除记录
delete from stu where name='lisi';
6)更新一条记录
update stu set name='wangwu' where id=1001;
update stu set name='wangwu',score=88 where id=1001;
7)更改表格插入一列
alter table stu add column address char; //添加一列地址
8)删除一列
sqlite3不支持,直接删除一列
1–创建一张新的表
create table stu1 as select id,name,score from stu;
2–删除原有的表
drop table stu;
3–将新表名字改为原来的名字
alter table stu1 rename to stu;

三、c语言操作SQLite3数据库

1.SQLite3编程接口

在这里插入图片描述

1)打开sqlite数据库

int sqlite3_open(char *path, sqlite3 **db)
-path:数据库文件路径
-db:指向sqlite句柄的指针(指针)
-返回值,成功为0,失败为错误码
-返回值:成功 SQLITE_OK

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

2)关闭sqlite数据库

int sqlite3_close(sqlite *db)
-返回值,成功为0,失败为错误码
-返回值:成功 SQLITE_OK

3)错误信息

const char *sqlite3_errmsg(sqlite3 *db)
-返回值:返回错误信息的首地址

4)执行一条sql语句

int sqlite3_exec(
  sqlite3* db,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

功能:执行一条sql语句
参数:
-db 数据库句柄
-sql 一条sql语句
-callback 回调函数,只有sql为查询语句时候,才会执行此句
-arg 表示给回调函数传参数
-errmsg 错误消息
返回值:
-成功 SQLITE_OK

回调函数的查询

int (*callback)(void*,int,char**,char**), /* Callback function */
功能:查询的结果是一个函数指针,传函数名
-功能:每找到一条记录自动执行一次回调函数
-para :传递回调函数的参数
-f_num: 记录包含的字段数目
-f_value: 包含每个字段值的指针数组
-f_name: 包含每个字段名称的指针数组
-返回值:成功为0,失败为-1

不使用回调函数的查询

int sqite3_get_table(sqlite3 *db,const char *sql, char ****resultp, int *nrow, int *ncolumn, char **errmsg)
-功能:执行SQL操作
-db:句柄
-sql:SQL语句
-resultp:用来指向sql执行结果的指针
-nrow:满足条件的记录的数目
-ncolumn:每条记录包含的字段数目
-errmsg:错误信息指针的地址
-返回值:成功返回0, 失败返回值错误码

c语言的编译

gcc student.c -lsqlite3
在这里插入图片描述
描述:找不到头文件
原因:系统没有安装函数库
解决办法:
sudo apt-get install libsqlite3-dev

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define  DATABASE "stu.db"
int do_insert(sqlite3 *db)
{
    int id;
    char name[32] = {0};
    int score;
    char sql[128] = {};
    char *errmsg;
    printf("Input id:");
    scanf("%d", &id);
    getchar();
    printf("Input name:");
    scanf("%s", &name[0]);
    getchar();
    printf("Input score:");
    scanf("%d", &score);
    getchar();
    sprintf(sql, "insert into stu values(%d,'%s',%d);",id, name, score); //拼接
    if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("insert success");
    }
    return 0;
}
int do_delete(sqlite3 *db)
{
    int id;
    char sql[128] = {};
    char *errmsg;
    printf("Input id:");
    scanf("%d", &id);
    getchar();
    sprintf(sql, "delete from stu where id=%d;",id); //拼接
    if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("delete success");
    }
    return 0;
}
int do_update(sqlite3 *db)
{
    int id;
    char sql[128] = {};
    int score;
    char *errmsg;
    printf("Input id:");
    scanf("%d", &id);
    getchar();
    printf("Upadate score:");
    scanf("%d", &score);
    getchar();
    sprintf(sql, "update stu set score = %d where id=%d;",score, id); //拼接
    if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("update success");
    }
    return 0;
}
int callback(void* para,int f_num,char** f_value,char** f_name)
{
    int i = 0;
    for (i=0; i < f_num; i++)
    {
        printf("%-11s",f_value[i]);
    }
    putchar(10);
    return 0;
}
int do_query(sqlite3 *db)
{
    char sql[128] = {};
    char *errmsg;
    sprintf(sql, "select * from stu;"); //拼接
    if (sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("query success");
    }
    return 0;
}
int do_query1(sqlite3 *db)
{
    char sql[128] = {};
    char *errmsg;
    char **resultp;
    int nrow;
    int ncloumn;
    int i,j;
    int index;
    sprintf(sql, "select * from stu;"); //拼接
    if (sqlite3_get_table(db, sql, &resultp, &nrow,&ncloumn, &errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("query1 success");
    }
    index = ncloumn;
    for (i = 0; i<nrow; i++)
    {
        for(j = 0; j <ncloumn; j++)
        {
            printf("%-11s",resultp[index++]);
        }
        putchar(10);
    }
    return 0;
}
int main(int argc, const char *argv[])
{
    sqlite3 *db;
    char *errmsg = NULL;
    int cmd;
    if (sqlite3_open(DATABASE, &db) != SQLITE_OK)
    {
        printf("%s.\n",sqlite3_errmsg(db));
        return -1;
    }
    else
    {
        printf("open database success.\n");
    }
    // 创建一张数据库的表格
    if (sqlite3_exec(db, "create table stu (id Intger, name char, score Intger);",NULL,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s.\n",errmsg);
        return -1;
    }
    else
    {
        printf("create table success.\n");      
    }
    while (1)
    {
        printf("*****************************************\n");
        printf("1:insert 2:delete 3:query 4:updata 5:query1 6:quit \n");
        printf("*****************************************\n");
        scanf("%d", &cmd);
        switch (cmd)
        {
        case 1:
            do_insert(db);
            break;
        case 2:
            do_delete(db);
            break;
        case 3:
            do_query(db);
            break;
        case 4:
            do_update(db);
            break;
        case 5:
            do_query1(db);
            break;
        case 6:
            sqlite3_close(db);
            exit(0);   
        default:
            break;
        }
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLite笔记-基本命令-c语言的使用 的相关文章

  • 修改sqlite3中的列类型

    我对 SQLite 3 还很陌生 现在我必须向现有的表中添加一列 我开始这样做 ALTER TABLE thetable ADD COLUMN category 当然 我忘记指定该列的类型 我想做的第一件事就是删除该列 然后重新添加它 然而
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • iPhone 开发 - sqlite3_bind_int 不起作用

    我正在尝试使用以下代码在数据库中插入一些数据 void insertLocationOnDatabase LocationType aLocation sqlite3 stmt stmt int location aLocation loc
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • SQLite 自然连接损坏?

    我刚刚开始了解 NATURAL JOIN 而 SQLite 的行为并不像我预期的那样 SELECT FROM r1 NATURAL JOIN r2 NATURAL JOIN r3 and SELECT FROM r1 NATURAL JOI
  • 使用 sqlite 离线存储数据的 Web 表单应用程序

    我有一个 asp net Web 表单应用程序 它在远程服务器上使用 sql server 2005 所有控件均使用 linq to sql 绑定 我正在尝试提供完整的离线功能 所以我想知道是否可以像 sql server db 一样创建一
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • SQLite支持android的数据类型有哪些

    谁能告诉我 SQLITE 中支持 ANDROID 的数据类型列表 我想确认 TIME 和 DATE 数据类型 这里有一个list http www sqlite org datatype3 htmlSQLite 的数据类型 支持时间和日期间
  • SQLite CreateDatabase 不支持错误

    我将 Entity Framework 4 2 CF 与 SQLite 一起使用 但是当我尝试启动该应用程序时 出现 提供商不支持 CreateDatabase 错误 这是我的模型映射 protected override void OnM
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • Android 中的 Sugar ORM:更新 SQLite 中保存的对象

    我是在 Android 上使用 SQLite 和 Sugar ORM 进行应用程序开发的新手 并尝试阅读 Sugar ORM 文档 但没有找到有关如何更新 SQLite 中保存的对象的任何信息 更改对象属性后还可以保存对象吗 就像是 Cus
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 如何在 Android 中使用 Assets 中预加载的 SQLite 数据库

    我想用preloaded database在我的应用程序中意味着尝试在安装 apk 时获取数据库 以便可以使用已保存在其中的数据 我复制了 成分 db 文件位于资产文件夹中 并使用以下代码 但这会出现错误 从资源文件复制数据库时出现问题 我
  • SQLite.Net-PCL 连接未找到数据库

    我一直在尝试创建一个 Windows Phone 我想使用 SQLite 来存储我的数据并学习如何在 Windows Phone 应用程序上使用它 为此 我使用 SQLite Net PCL 但我不断收到文件未找到异常 这是我写的代码 St
  • Android 中读取未提交的事务

    我正在进行大量数据库操作 这会向我的数据库添加大约 10 000 条记录 由于这可能需要很长时间 因此最好使用事务 db startTransaction do write operations db setTransactionSucce
  • Hibernate + SQLite 不创建数据库

    这是我的问题 我有一个使用 JavaFX Hibernate SQLite 的桌面应用程序 这是我的模型 Entity Table name usuario public class Usuario implements AbstractM
  • sqlite3和pdo_sqlite有什么区别

    我正在将我的 Web 应用程序从 MySQL 迁移到 SQLite 数据库 我发现有两个 PHP 扩展用于与 sqlite 通信 php sqlite3 dll and php pdo sqlite dll 什么扩展比较好 或者另一个问题
  • 评估 SQLite 中的连续行对

    我的 SQLite 表中有数据 如下所示 user id event date 1000001 2008 01 01 1000001 2008 03 13 1000001 2008 07 04 1000002 2007 01 06 1000
  • 如何通过C#在SQLite数据库中写入变量DateTime值?

    我很新C and SQLite数据库并有一些变量存储在 SQLite 数据库中TimeStamp 这是我的代码 DateTime now DateTime Now m dbConnection new SQLiteConnection Da

随机推荐

  • 详解K8s基本概念

    没等到风来 绵绵小雨 所以写个随笔 聊聊k8s的基本概念 k8s是一个编排容器的工具 其实也是管理应用的全生命周期的一个工具 从创建应用 应用的部署 应用提供服务 扩容缩容应用 应用更新 都非常的方便 而且可以做到故障自愈 例如一个服务器挂
  • 信息抽取之街道抽取

    如何从文本信息抽取出道路信息 问题 从给定的语料中抽取出相应的道路信息 数据 向塘北大道西50米 天龙路与龙华路交叉口北50米 观澜大道490号附近 成都市锦江区海椒市街13号附7号 玉兰西路 团结北路23号 湖塘镇火炬北路12号 昆明市晋
  • Linux在Docker中安装Gitlab

    1 安装Gitlab前先把git安装上 yum install y git 2 安装成功后查看git版本信息 git version 3 设置git的账户信息 git config global user name 名称 git confi
  • 在vue中怎么解决跨域问题(CORS)

    在Vue中解决跨域问题有多种方法 以下是几种常见的方法 1 代理服务器 在开发环境中 可以配置一个代理服务器来转发 API 请求 绕过浏览器的同源策略 可以使用 http proxy middleware 等中间件来实现代理配置 在 vue
  • 基于SSM+JSP的新闻发布管理系统

    项目技术栈 末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • 傅立叶变换小结

    文章目录 傅立叶何许人也 傅立叶分析是什么 傅立叶变换有什么用 傅立叶变换和拉普拉斯变换 傅立叶变换的类型和快速傅立叶变换 参考文献 由于学习雷达信号处理需要 自己把傅立叶变换好好看了一遍 本科的时候也学到过一点 但也早就还给老师了 毕竟不
  • Smart3D空三不过的解决办法

    Smart3D空三不过的解决办法 问题1 空三完成后提示有大量照片未参与重建 答案1 1 若测区无大面积同名点难以识别的地物地貌 例如水域 沙漠 玻璃等 出现大量照片未参与重建的情况一般是初始的 传感器尺寸 sensor size 或者 相
  • vue如何获取一个元素的高度

    Vue 中获取一个元素的高度可以使用 JavaScript 原生方法或者 Vue 内置的 refs 使用 JavaScript 原生方法 可以在 mounted 钩子函数中获取到元素 然后使用 offsetHeight 属性获取元素高度 m
  • 基于卷积的图像分类识别(二):ZFNet

    本专栏介绍基于深度学习进行图像识别的经典和前沿模型 将持续更新 包括不仅限于 AlexNet ZFNet VGG GoogLeNet ResNet DenseNet SENet MobileNet ShuffleNet Eifficient
  • git status提示detached HEAD解决办法

    有时候 需要查看某个Tag中的代码 就会使用git checkout tag name 切换到tag中 此时 如果使用git status来查看当前的状态时 会报detached HEAD的提示 detached HEAD表示当前的HEAD
  • [Shell] if、for、while流程语句以及整数字符串判断比较的实例详解

    前言 实际上Shell是一个命令解释器 它解释由用户输入的命令并且把它们送到内核 不仅如此 Shell有自己的编程语言用于对命令的编辑 它允许用户编写由shell命令组成的程序 Shell编程语言具有普通编程语言的很多特点 比如它也有循环结
  • 获取本周几

    转载 https blog csdn net zhaodecang article details 77919804 commentBox import java text SimpleDateFormat import java util
  • 优化理论

    版权声明 原创作品 整理不易 转载请标明出处 本篇推送更详细的内容介绍 可参见本人微信公众号 优化与博弈的数学原理 公众号二维码参见文末 或参见以下网址 优化理论 Time Sharing Condition 编者按 OFDM系统中的功率分
  • Python 计算 log以2为底的对数

    import numpy as np a np log2 4 print a str a 返回值 a 2 0
  • java调用javafx,javafx 调用java_Java,JavaFX的流畅设计风格滑块

    javafx 调用java JMetro的Java JavaFX主题版本刚刚提高到4 2版 此版本为Slider控件带来了新样式 除此之外 您现在还可以看到一个弹出窗口 向您显示滑块的当前值 新滑块样式 以下是旧的JMetro Slider
  • Pinpoint--基础--06--界面说明

    Pinpoint 基础 06 界面说明 1 查看应用调用关系拓扑图 进入pintpoint gt gt 选择应用 gt gt 选择查看的时间周期 即可查看应用调用关系拓扑图 图文说明如下 2 查看应用单个节点调用情况 点击右侧View Se
  • 大数据时代的新星,图数据库究竟是什么?

    随着5G万物互联时代的到来 社交 电商 金融 物联网等行业织起了一张庞大而复杂的数据关系网 获得了新的发展空间 然而要想真正利用数据 获取越来越多 越来越复杂的关联数据中产生的业务价值 并非易事 为了应对大数据新时代的难题 工业界将越来越多
  • adb 通过wifi连接手机

    adb 通过wifi连接手机 1 电脑通过USB线连接手机 2 手机开启USB调试模式 开启手机开发者模式 3 手机开启USB调试模式 更多设置 开发者选项 USB调试 4 点击Wi Fi 高级设置 可以查看到手机Wi Fi的IP地址 此I
  • 微信小程序项目真机调试图片不显示处理

    微信开发者上图片显示 但在真机调试时不显示 查看数据库图片文件上传方式 如果是本地地址 改成网络地址即可 如图 查找ip网络地址方法 按windows R快捷键 输入CMD 输入ipconfig 复制IPv4地址192 168 0 2到上图
  • SQLite笔记-基本命令-c语言的使用

    一 数据库介绍 1 数据库的基本概念 数据 能够输入计算机并能被计算机程序识别和处理的信息集合 数据库 数据库是在数据库管理系统管理和控制之下 存放在存储介质上的数据集合 2 常用的数据库 1 大型数据库 1 oracle公司是最早开发数据