sqlite3_exec虽然好用,但是一般不推荐直接使用。

常用的一组操作是:

关于sqlite3_exec和sqlite3_prepare_v2的使用场景,建议如下:

一个小DEMO:

#include <stdio.h>
#include <sqlite3.h> int main(int argc, char **argv)
{
sqlite3 *db;
int rc; rc = sqlite3_open("test.db", &db); if (rc) {
printf("Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return ;
} else {
printf("Open database successfully\n");
} sqlite3_stmt *stmt = NULL; const char *sql = "SELECT * FROM COMPANY";
// const char *sql = "SELECT * FROM COMPANY WHERE AGE=?;"; sqlite3_prepare_v2(db, sql, -, &stmt, NULL); // sqlite3_bind_int(stmt, 1, 25); int col_count = sqlite3_column_count(stmt);
printf("该条记录共%d列\n", col_count); while (SQLITE_ROW == sqlite3_step(stmt)) {
int column0_type = sqlite3_column_type(stmt, );
const char *column0_name = sqlite3_column_name(stmt, );
int column0_value = sqlite3_column_int(stmt, );
printf("col: 0 type: %d name: %-10s value: %d\n", column0_type, column0_name, column0_value); int column1_type = sqlite3_column_type(stmt, );
const char *column1_name = sqlite3_column_name(stmt, );
const unsigned char *column1_value = sqlite3_column_text(stmt, );
printf("col: 1 type: %d name: %-10s value: %s\n", column1_type, column1_name, column1_value); int column2_type = sqlite3_column_type(stmt, );
const char *column2_name = sqlite3_column_name(stmt, );
int column2_value = sqlite3_column_int(stmt, );
printf("col: 2 type: %d name: %-10s value: %d\n", column2_type, column2_name, column2_value); int column3_type = sqlite3_column_type(stmt, );
const char *column3_name = sqlite3_column_name(stmt, );
const unsigned char *column3_value = sqlite3_column_text(stmt, );
printf("col: 3 type: %d name: %-10s value: %s\n", column3_type, column3_name, column3_value); int column4_type = sqlite3_column_type(stmt, );
const char *column4_name = sqlite3_column_name(stmt, );
double column4_value = sqlite3_column_double(stmt, );
printf("col: 4 type: %d name: %-10s value: %.2f\n", column4_type, column4_name, column4_value); printf("\n");
}
sqlite3_finalize(stmt); // char *zErrMsg = 0;
// sqlite3_stmt *stmt_insert;
// const char *sql_insert = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
// "VALUES (5, 'Logan', 26, 'California', 20000.00 );";
// sqlite3_prepare_v2(db, sql_insert, -1, &stmt_insert, NULL);
// if (sqlite3_step(stmt_insert) != SQLITE_DONE) {
// printf("Insert Table Failed\n");
// sqlite3_free(zErrMsg);
// }
// sqlite3_finalize(stmt_insert); sqlite3_close(db);
return ;
}

参考资料:

sqlite3_prepare_v2 / sqlite3_exec

[转载] Sqlite c/c++ api学习

SQLite使用(二)的更多相关文章

  1. android数据存储之Sqlite(二)

    SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...

  2. SQLite使用(二)&&数据类型

    1.概述 我们熟知的数据库引擎大部分采用静态数据类型,即列定义的类型定义了值的存储,并且值要严格满足列的定义,同一列所有值的存储方式都相同,比如定义了一个列类型为整型 int,不能在该列上输入'abc ...

  3. Android中用文件初始化sqlite 数据库(二)

    博 androidsqlite启动时数据库初始化  方法1已经讲述了一种初始化数据库的方法 它的数据库初始化不是用sql语句,而是用一个现成的sqlite的二进制文件进行直接copy到Android系 ...

  4. FireDAC中的SQLite(二)

    我们接下来将要使用FDDemo.sdb数据库进行访问,开始我们的第一个SQLite访问例子. 我们的FDDemo.sdb存放目录在:C:\Program Files (x86)\Embarcadero ...

  5. Android基础------SQLite数据库(二)

    1.操作SQLite数据库 1.1 execSQL() 可以执行insert.delete.update和CREATE TABLE之类有更改行为的SQL语句 1.2 rawQuery() 可以执行se ...

  6. Android笔记(四十) Android中的数据存储——SQLite(二) insert

    准备工作: 我们模拟一个注册的页面,先看UI 我们需要创建一个数据库:user,数据库包含表user,user表包含字段id.username.password.mobilephone MainAct ...

  7. 创建Sqlite数据库(二)

    先创建一个数据库表,然后在主activity中执行删除更新操作 public class MainActivity extends AppCompatActivity { @Override prot ...

  8. SQLite基础-8.子句(二)

    目录 SQLite子句(二) 1. GROUP BY子句 2. HAVING子句 3. LIMIT 子句 4. IF EXISTS 和 IF NOT EXISTS 子句 SQLite子句(二) 1. ...

  9. SQLite学习笔记(六)&&共享缓存

    介绍 通常情况下,sqlite中每个连接都会一个独立的pager对象,pager对象中管理了该连接的缓存信息,通过pragma cache_size指令可以设置缓存大小,默认是2000个page,每个 ...

随机推荐

  1. Array(数组)对象-->数组值的修改

    1.修改数组值: 数组对象名[下标] = 新值: 举例:原数组如下: var arr = [1,2,3,4,5] 需求:将arr数组第二个元素的值改为10,代码如下: arr[1] = 10; con ...

  2. alg-最长公共子串

    class Solution { public: const std::vector<std::string> LongestCommonSubstring(const std::stri ...

  3. 天天在用Redis,持久化方案你又知道哪些?

    前言 文章首发于微信公众号[码猿技术专栏]:天天用Redis,持久化方案有哪些你知道吗? Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了解Redis内部的工作原 ...

  4. 经典算法之归并排序——python和JS实现

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:韩忠康 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  5. vue2.x学习笔记(二十三)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12639440.html. 渲染函数&JSX 基础 vue推荐在绝大多数的情况下使用模板来创建html.然而 ...

  6. 串匹配问题 (KMP算法) 详解

    串这个概念对于我们学到现在的水平来说应该是经历颇丰了,因为在C语言中我们所用到的"串"知识是在字符串那里,有了这个概念,我们再去学习串就相对而言轻松多了. 那么,现在来介绍一下字符 ...

  7. linux 文件的查找和压缩

    1.使用 locate 命令 需要安装:yum install mlocate -y 创建或更新 slocate/locate 命令所必需的数据库文件:updatedb 作用:搜索不经常改变的文件如配 ...

  8. SpringBoot集成MyBatis底层原理及简易实现

    MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理.完整代码可移步Github. 如何使用MyBatis 一般情况下,我们在Sp ...

  9. Springboot:员工管理之公共页面提取 高亮显示(十(5))

    把顶部和左侧的公共代码分别放到header.html和left.html中 顶部代码:resources\templates\header.html 主内容展示: <!DOCTYPE html& ...

  10. C# WCF的通信模式

    wcf 通信模式一般分为三种; 1,请求/响应模式 2,单工模式 3,双工模式 一,请求/响应模式 请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应.这也意味着在接收到服务的响应以 ...