C语言使用Sqlite

Csqlite

Mac下

Xcode中需要引入libsqlite3.0.tbd

Windows下

需要用到sqlite3.lib

sqlite3官网上并没有sqlite3.lib可下载,要用需自编译生成。官网地址

如从sqlite3.7.5版本中得到sqlite3.lib,可用VS的LIB工具链接得到。 具体过程如下:

  1. 先将sqlite-dll-win64-x64-3090100.rar解压到文件夹sqlite-dll-win64-x64-3090100,
  2. 再将VS安装目录下VC中的LIB.EXE,LINK.EXE复制到sqlite-dll-win64-x64-3090100文件夹,(lib.exe,link.exe地址:C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin)
  3. 在网上下载mspdb60.dll,复制到sqlite-dll-win64-x64-3090100文件夹,
  4. 将Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE内的 mspdb110.dll复制到sqlite-dll-win64-x64-3090100文件夹。
  5. 在命令窗内运行命令进入sqlite-dll-win64-x64-3090100文件夹
  6. 执行LIB /DEF:SQLITE3.DEF /MACHINE:IX86或LIB /DEF:SQLITE3.DEF 即可生成sqlite3.lib文件。
  7. 然后将sqlite3.lib文件引入项目中

sqlite3.lib下载

或者,使用一个超简单的方法.直接从官网上下载源文件,然后把sqlite3.c, sqlite3.h 放入工程中~

主要函数

**sqlite3_open(const char *filename,sqlite3 ppDb)

  • filename: 数据库文件的名字
  • ppDb: sqlite的一个handle,之后通过这个handle对数据库做操作

sqlite3_exec(sqlite3*, const char *sql,int (*callback)(void*,int,char**,char**),void *,char **errmsg)

  • sqlite3: 一个已经打开的handle(通过sqlite3_open处理过)
  • sql: 需要执行的sql语句
  • int (*callback)(void*,int,char**,char**): 一个回调函数
  • void*: 一个回调参数
  • **errmsg 错误消息

具体增删查改操作

//c
#include "sqlite3.h"

创建数据库文件

//c
sqlite3 *getDatabase()
{
    sqlite3 *db=NULL;
    int rc;
    rc = sqlite3_open("test.db", &db);   //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
    if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
    }
    return db;
}

建表

//c
void createTable()
{
    sqlite3 *db = getDatabase();
    const char * sql = "CREATE TABLE IF NOT EXISTS testTable(id integer primary key,a text,b text,c text);";
    char * pErrMsg = "0";
    int result = sqlite3_exec(db, sql, 0, 0, &pErrMsg );
    if( result != SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", pErrMsg);
        sqlite3_free(pErrMsg);
    }
    sqlite3_close(db);                //关闭数据库
}

增

//c
void insertIntoDatabase()
{
    sqlite3 *db = getDatabase();
    char * pErrMsg = 0;
    int result = sqlite3_exec(db, "INSERT INTO testTable(a,b,c) VALUES(1,2,3);", 0, 0, &pErrMsg);
    if(result == SQLITE_OK){
        printf("插入数据成功\n");
    }
    sqlite3_close(db);                //关闭数据库
}

删

//c
void deleteFromTable()
{
    sqlite3 *db = getDatabase();
    char *pErrMsg = 0;
    sqlite3_exec(db, "delete from testTable where id = 2", NULL,NULL, &pErrMsg);
    sqlite3_close(db);
}

查

//c
int select_callback(void * data, int col_count, char ** col_values, char ** col_Name)
{
    // 每条记录回调一次该函数,有多少条就回调多少次
    int i;
    for( i=0; i < col_count; i++){
        printf( "%s = %s\n", col_Name[i], col_values[i] == 0 ? "NULL" : col_values[i] );
    }
    
    return 0;
}
void databaseQuery()
{
    sqlite3 *db = getDatabase();
    char * pErrMsg = 0;
    sqlite3_exec(db, "select * from testTable;", select_callback, 0, &pErrMsg);
    sqlite3_close(db);                //关闭数据库
}

输出很奇葩,需要根据自己项目做修改

改

//c
void updateTable()
{
    sqlite3 *db = getDatabase();
    char *pErrMsg = 0;
    sqlite3_exec(db, "update testTable set a = 666 where id = 1" , NULL, NULL, &pErrMsg);
    sqlite3_close(db);
}