SQLite使用(二)
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使用(二)的更多相关文章
- android数据存储之Sqlite(二)
SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...
- SQLite使用(二)&&数据类型
1.概述 我们熟知的数据库引擎大部分采用静态数据类型,即列定义的类型定义了值的存储,并且值要严格满足列的定义,同一列所有值的存储方式都相同,比如定义了一个列类型为整型 int,不能在该列上输入'abc ...
- Android中用文件初始化sqlite 数据库(二)
博 androidsqlite启动时数据库初始化 方法1已经讲述了一种初始化数据库的方法 它的数据库初始化不是用sql语句,而是用一个现成的sqlite的二进制文件进行直接copy到Android系 ...
- FireDAC中的SQLite(二)
我们接下来将要使用FDDemo.sdb数据库进行访问,开始我们的第一个SQLite访问例子. 我们的FDDemo.sdb存放目录在:C:\Program Files (x86)\Embarcadero ...
- Android基础------SQLite数据库(二)
1.操作SQLite数据库 1.1 execSQL() 可以执行insert.delete.update和CREATE TABLE之类有更改行为的SQL语句 1.2 rawQuery() 可以执行se ...
- Android笔记(四十) Android中的数据存储——SQLite(二) insert
准备工作: 我们模拟一个注册的页面,先看UI 我们需要创建一个数据库:user,数据库包含表user,user表包含字段id.username.password.mobilephone MainAct ...
- 创建Sqlite数据库(二)
先创建一个数据库表,然后在主activity中执行删除更新操作 public class MainActivity extends AppCompatActivity { @Override prot ...
- SQLite基础-8.子句(二)
目录 SQLite子句(二) 1. GROUP BY子句 2. HAVING子句 3. LIMIT 子句 4. IF EXISTS 和 IF NOT EXISTS 子句 SQLite子句(二) 1. ...
- SQLite学习笔记(六)&&共享缓存
介绍 通常情况下,sqlite中每个连接都会一个独立的pager对象,pager对象中管理了该连接的缓存信息,通过pragma cache_size指令可以设置缓存大小,默认是2000个page,每个 ...
随机推荐
- Array(数组)对象-->splice() 方法
1.定义和用法 splice() 方法用于添加或删除数组中的元素. 语法: array.splice(index,howmany,item1,.....,itemX) 参数: index:该参数是开始 ...
- Struts2-学习笔记系列(3)-返回视图
Action执行execute返回字符串,又如何返回对应的页面呢? 关在在于struts中action节点配置的result.如下: 内置有的ERROR SUCCESS等好几种.看源码即可 publ ...
- python3(十) iteration
d = {'a': 1, 'b': 2, 'c': 3} for key in d: print(key, end=' ') # a b c dict的存储不是按照list的方式顺序排列,所以,迭代出 ...
- MAC 系统java开发环境搭建教程
1.在安装JDK之前,先查看下自己电脑是否已经安装了JDK. 打开终端,输入java -version并回车. 从上图中可以看出我们已安装了,JDK 8.如果这个版本是你需要的版本,可直接看4 ...
- 钩子函数 Function类
Function 为 com.google.common.base包下接口类: public interface Function<F, T> { @Nullable T apply(@N ...
- springboot项目war包部署及出现的问题Failed to bind properties under 'mybatis.configuration.mapped-statements[0].
1.修改pom文件 修改打包方式 为war: 添加tomcat使用范围,provided的意思即在发布的时候有外部提供,内置的tomcat就不会打包进去 <groupId>com.scho ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十二)之Error Handling with Exceptions
The ideal time to catch an error is at compile time, before you even try to run the program. However ...
- 别再问我 new 字符串创建了几个对象了!我来证明给你看!
我想所有 Java 程序员都曾被这个 new String 的问题困扰过,这是一道高频的 Java 面试题,但可惜的是网上众说纷纭,竟然找不到标准的答案.有人说创建了 1 个对象,也有人说创建了 2 ...
- tortoise 设置beyond Compare比较工具
1.桌面右击tortoiseSVN->setting->Diff Viewer面板,选择external,选中beyond Compare路径
- vue2.x学习笔记(六)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12571171.html. class与style绑定 操作元素的class列表和内联样式,是数据绑定的一个常见需求 ...