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. HBase协处理器加载的三种方式

    本文主要给大家罗列了HBase协处理器加载的三种方式:Shell加载(动态).Api加载(动态).配置文件加载(静态).其中静态加载方式需要重启HBase. 我们假设我们已经有一个现成的需要加载的协处 ...

  2. MAC 上brew 更新 出错

    在MAC上brew update的时候出现报错:Error: /usr/local must be writable! 错误,在该文章中也给出解决办法(sudo chown -R $(whoami) ...

  3. VulnHub靶场学习_HA: Avengers Arsenal

    HA: Avengers Arsenal Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-avengers-arsenal,369/ 背景: 复仇者联盟 ...

  4. 使用mysqlbinlog查看二进制日志

    (一)mysqlbinlog工具介绍 binlog类型是二进制的,也就意味着我们没法直接打开看,MySQL提供了mysqlbinlog来查看二进制日志,该工具类似于Oracle的logminer.my ...

  5. 用pip install不能成功安装时的处理方法

    解决办法: pip install pymysql -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

  6. C#获取文件夹内文件包括子文件(递归)实例

    这个在我工作上,写了一次工具项目,用上的. static ArrayList FileList = new ArrayList();//这个必须写在方法外, static ArrayList GetA ...

  7. pytorch 中word embedding 词向量的使用

  8. Docker 中如何安装配置 Nginx

    拉取 nginx 最新版镜像,然后简单启动一个 nginx 容器: docker pull nginx:latest docker run --name nginx01 -d -p 80:80 ngi ...

  9. Linux下jdk的安装和环境变量的配置

    Linux下jdk的安装和环境变量的配置 一.jdk的下载 方式一:在官网下载 http://www.oracle.com/technetwork/java/javase/downloads/inde ...

  10. 关于Swiper和vue数据顺序加载问题处理

    在使用swiper插件的时候,常常因为异步加载数据产生的顺序问题而使插件不能正常实行,所以可以使用vue的updated来解决. 问:什么时候 进updated方法? 答:只有事先设置好的data变量 ...