最近几天在学习sqlite3,颇有点收获,下面介绍一下简单用法:
1.先下载sqlite3.h和sqlite3.c(如果不知道怎么下载的话就去www.sqlite.org)
如果要编译成lib。则需要用到sqlite3.def 文件。具体要把sqlite3.def放到我们vs安装目录的的bin目录下。利用lib.exe来生成 sqlite3.lib。命令为: LIB /DEF:sqlite3.def /machine:IX86。如果执行成功的话,在bin目录下就可以找到sqlite3.lib 和sqlite3.exp 文件。lib文件就可以用了。
我用的vs2010,所以就拿vs2010来举例吧,新建工程SqliteTest,建好后把sqlite3.h和sqlite3.c添加到工程里,然后在建立一个main.cpp来写测试代码,如图所示:

2.先介绍基本函数:
1)打开数据库:
int sqlite3_open(
const char *filename,     /* Database filename (UTF-8) */
                            sqlite3 **ppDb                /* OUT: SQLite db handle */

                          );
说明:filename是要打开或创建的数据库文件,可以以.db的结尾(如:test.db),如果没有此文件则系统会创建此文件,否则系统将打开指定的数据库;ppDb是指针的指针,指向sqlite3*的输出参数,因此打开数据库前先要定义sqlite3*数据类型。
注意:sqlite3* 数据类型在以后得操作中经常被使用到。
返回类型:当返回SQLITE_OK时代表执行成功,SQLITE_OK是sqlite预定义的一个宏,在sqlite3.h中可以找到更多的宏,如打开一个test.db的操作:
sqlite3 *db = NULL;
int result ;
result = sqlite3_open("D:\\test.db", &db );
if(result == SQLITE_OK)
{
        //执行下一步操作。。。。。。。
}

2)执行有回调函数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 */
);
说明:第一个参数不说了(就是sqlite3_open()的那个输出参数), 第二个参数是要执行的sql语句,以‘\0’结尾的字符窜,
第三个参数callback为回调函数,此函数的作用是当执行完sqlite3_exec()时,自动执行的,就像windows下的线程函数一样,
第四个参数为传递给callback函数的第一个参数,最后一个为输出参数,执行前需要预先设置为空,当此函数执行失败是可以查看
errmsg来查找错误原因。当执行select语句时经常用到回调函数。当不需要执行回调函数时,callback参数,和void*参数都
可以设置为空。同样当返回SQLITE_OK时代表成功。 回调函数callback:
int (*callback)(void *para, int nCols, char **ColValue, char **ColName);
说明:para参数通过传进来的参数,进行强制转换来使用,
nCols参数为执行的结果的列数(字段数目);
ColValue参数为每一列的值,
ColName参数为字段名。
注意:ColValue和ColName都为一维数组,通过循环来取值(利用 ColValue[i] 或者 *(ColValue + i) 可以取得到值 )。
并不是每次回调函数都要执行,比如select语句,只有查找到结果时才执行callback函数,查找不到结构是不会执行的 3)执行无回调函数的sql语句:
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
char ***azResult, /* Results of the query */
int *nRow, /* Number of result rows written here */
int *nColumn, /* Number of result columns written here */
char **errMsg /* Error msg written here */
);
说明:参数db不用说了
参数sql也不用说
参数azResult为结果,是输出参数。要记住它是一维数组哦,此结果中包括了表头(即列名)从0到nColumn,azResult[i]为列名,此后全为
列的值,看下图可以说明问题(此图是粘贴的,将就看吧,可以说明问题的):

        参数nRow为结果的行数(即多少条记录),为输出参数
        参数nColumn为结果的列数(字段数),为输出参数
        参数errMsg是错误信息,前面有介绍,不多说,为输出参数
 执行完以后别忘了执行释放资源函数:void sqlite3_free_table(char **result);

4)最后关闭数据库:
  void sqlite_close(sqlite *db);
说明:操作完数据库后别忘了关闭数据库; 下面来粘贴代码部分:
#include"sqlite3.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h> int MyCallback(void *para, int nColumn, char ** colValue, char ** colName);//回调函数 void main(int argc, char *argv[])
{
sqlite3* db = NULL;
int result = sqlite3_open("D:\\test.db", &db); if(result != SQLITE_OK)
{
printf("open database text.db failed \n");
return;
}
else
{
printf("open database text.db success \n");
}
////////开始执行sqlite
const char *sql = "create table Student(t_id integer primary key autoincrement, t_name varchar(15), t_age integer)";
char *errMsg = NULL;
result = sqlite3_exec(db,
sql,
NULL,
NULL,
&errMsg);
if(result != SQLITE_OK)
{
printf("create table Student failed\n");
printf("error conde %d \t error message:%s", result, errMsg);
}
//插入数据
errMsg = NULL;
sql = "insert into Student(t_name, t_age) values ('dwb', 23)";
result = sqlite3_exec(db,
sq,
NULL,
NULL,
&errMsg);
printf("insert message1:%s \n", errMsg); errMsg = NULL;
sql = "insert into Student(t_name, t_age) values ('dhx', 25)";
result = sqlite3_exec(db,
sql,
NULL,
NULL,
&errMsg);
printf("insert message2:%s \n", errMsg); errMsg = NULL;
sql = "insert into Student(t_name, t_age) values ('dwz', 21)";
result = sqlite3_exec(db,
sql,
NULL,
NULL,
&errMsg);
printf("insert message3:%s \n", errMsg); ////////////////////////////////////////////////////////
errMsg = NULL;
sql = "select * from Student;";
result = sqlite3_exec(db, sql, MyCallback, NULL, &errMsg);
printf("select message:%s \n", errMsg); //执行不用回调函数的sql语句,先要设置函数所需的参数
printf("\nUSEING sqlite3_get_table()----------------------------\n");
sql = "select * from Student;"; int nCols;
int nRows;
char **azResult;
errMsg = NULL;
int index = 0; result = sqlite3_get_table(db,sql, &azResult, &nRows, &nCols, &errMsg);
printf("result = %d \t errMsg = %s \n", result, errMsg);
printf("rows:%d \t cols: %d \n", nRows, nCols);
index = nCols; printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
for(int i = 0; i < nRows; i ++)
{
for(int j = 0; j < nCols; j ++)
{
printf("%s::%s", azResult[j], azResult[index]);
index ++;
printf("\n");
}
}
printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); sqlite3_free_table(azResult);
sqlite3_close(db);
} int MyCallback(void *para, int nColumn, char ** colValue, char ** colName)
{
printf("----------------------------------------------------\n");
printf("包含的列数:%d\n", nColumn);
for(int i = 0;i < nColumn; i ++)
{
printf("%s :%s\n", *(colName + i), colValue[i]);//指针和数组的两种写法
}

printf("----------------------------------------------------\n");
return 0;
}

结果如下:


学会这些后基本可以使用sqlite了,当然这些只是sqlite博大精深的冰山一角,笔者还在学习中,以后会陆续更新。。。。

C/C++操作SQLite的更多相关文章

  1. Java操作Sqlite数据库-jdbc连接

    Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...

  2. C#操作SQLite数据库

    SQLite介绍 SQLite is a software library that implements a self-contained, serverless, zero-configurati ...

  3. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  4. 操作SQLite的dbhelper

    操作SQLite的dbhelper public class DbHelper { string connStr = @"Data Source=" + System.Enviro ...

  5. python操作sqlite数据库

    root@cacti:~/box# cat convert.py #!/usr/bin/env python import sqlite3,time,rrdtool,os def boxstatus( ...

  6. .NET中操作SQLite

    C#操作SQLite Database C#下SQLite操作驱动dll下载:System.Data.SQLite C#使用SQLite步骤: (1)新建一个project (2)添加SQLite操作 ...

  7. PHP操作SQLITE

    一直以来.我们操作SQLITE,都是基于PHP默认的SQLITE操作模块. 今天介绍一个能够操作SQLITE2,和SQLITE3的PHP类,此为我封装的. <? php abstract cla ...

  8. mips平台使用jdbc操作sqlite的最终解决方案

    1.概述: 本项目需要在多平台上(mips必须支持)操作嵌入式数据库sqlite,而最新的sqlite-jdbc-3.15.1.jar的本地驱动只含有少量的平台,于是解决支持mips平台实在必行.方法 ...

  9. 简洁的PHP操作SQLite类

    SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了. ...

  10. python之数据库操作(sqlite)

    python之数据库操作(sqlite) 不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接A ...

随机推荐

  1. Java 基础 - 比较方式选择(什么类型用equals()比较,什么类型用==比较)

    ref: https://www.cnblogs.com/lori/p/8308671.html 在 java 中进行比较,我们需要根据比较的类型来选择合适的比较方式: 对象域,使用 equals 方 ...

  2. thinkphp 模板渲染

    模板定义后就可以渲染模板输出,系统也支持直接渲染内容输出,模板赋值必须在模板渲染之前操作. 大理石平台价格表 渲染模板 渲染模板输出最常用的是使用display方法,调用格式: display('[模 ...

  3. MySql学习笔记(一)之DQL常用查询

    MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前, ...

  4. Django项目:堡垒机(Linux服务器主机管理系统)--02--02堡垒机设计后台交互程序

    #main.py #本文件写所有的连接交互动作程序 #————————————————02堡垒机设计后台交互程序 开始———————————————— from django.contrib.auth ...

  5. go操作空指针导致supervisor进程服务挂机的坑

    一.起因 在数据库中直接手动插入了某条记录,但由于该记录的某个字段的空值,与另一个字段的状态码不符合,在go程序中,突然操作了该空字段的指针,导致程序panic挂机. panic: runtime e ...

  6. django-filter 实现过滤时查询是否包含在数组的方法,in数组的实现

    查了半天无解,还是在官网找到的,记录一下 使用 BaseInFilter 官网地址:https://django-filter.readthedocs.io/en/master/ref/filters ...

  7. transient在java中的作用

    java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...

  8. 06_mybatis关系映射

    1.数据库表分析 表与表之间的业务关系: ​ 在分析表与表之间的业务关系时需要建立 在某个业务意义基础上去分析; ​ 先分析数据级别之间有关系的表之间的业务关系; usre和orders: ​ use ...

  9. iOS开发系列-GCD

    概述 GCD是苹果公司为多核的并行运算提出的解决方案.全称是Grand Central Dospatch.纯C语言,提供了非常多强大的函数. GCD自动管理线程的声明周期(创建线程.调度任务.销毁线程 ...

  10. crontab中反引号和$()无效的解决

    问题描述 1.增加了一条crontab,删除本月中2天以前的日志 10 02  * * * /bin/find /data/logs/php/$(date  +%Y%m)/ -mtime +2 | x ...