sqlite学习笔记10:C语言中使用sqlite之查询和更新数据

前面说到的 sqlite_exec() 中的第三个参数, SQLite 将为 sql 参数内执行的每个 SELECT 语句中处理的每个记录调用这个回调函数。

本节添加了两个函数,selectFromTable和updateTable.

实例程序如下:

#include <stdio.h>
#include <stdlib.h>
#include "sqlite/sqlite3.h"

#define DB_NANE "sqlite/test.db"

sqlite3 *db = NULL;
char* sql = NULL;
char *zErrMsg = NULL;
const char* data = "Callback function called";/* 改为全局的 */
int ret = 0;

typedef enum{
    false,
    true
} bool;

/*
typedef int (*sqlite3_callback)(
void*,    Data provided in the 4th argument of sqlite3_exec()
int,      The number of columns in row
char**,   An array of strings representing fields in the row
char**    An array of strings representing column names
);
*/
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    for(i=0; i < argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");

    return 0;
}

bool connectDB()
{
    ret = sqlite3_open(DB_NANE, &db);

    if( ret != SQLITE_OK){
        fprintf(stderr, "Error open database: %s\n", sqlite3_errmsg(db));
        sqlite3_free(zErrMsg);

        return false;
    }

    fprintf(stdout, "Successfully opened database\n");
    return true;
}

bool createTable()
{
    /* Create SQL statement */
    sql = "CREATE TABLE COMPANY("      "ID INT PRIMARY KEY     NOT NULL,"     "NAME           TEXT    NOT NULL,"     "AGE            INT     NOT NULL,"     "ADDRESS        CHAR(50),"     "SALARY         REAL );";

    /* Execute SQL statement */
    ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if( ret != SQLITE_OK ){
        fprintf(stderr, "Error SQL: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);

        return false;
    }

    fprintf(stdout, "Successfully table created\n");

    return true;
}

bool insertRecords()
{
    /* Create SQL statement */
    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "      "VALUES (1, 'Paul', 32, 'California', 20000.00 ); "     "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "      "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)"     "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"     "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)"     "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

    /* Execute SQL statement */
    ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if( ret != SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
        return false;
    }

    fprintf(stdout, "successfully records created\n");

    return true;
}
bool selectFromTable()/*新加*/
{
    /* Create SQL statement */
    sql = "SELECT * from COMPANY";

    /* Execute SQL statement */
    ret = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
    if( ret != SQLITE_OK ){
        fprintf(stderr, "Error SQL: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
        return false;
    }

    fprintf(stdout, "successfully operation done\n");

    return true;
}
bool updateTable()/* 新加 */
{
    /* Create merged SQL statement */
    sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; "     "SELECT * from COMPANY";
    
    /* Execute SQL statement */
    ret = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
    if( ret != SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
        
        return false;
    }
    
    fprintf(stdout, "Successfully operation done \n");
    
    return true;
}

bool closeDB()
{
    int ret = 0;
    ret = sqlite3_close(db);
    if ( ret == SQLITE_BUSY ){
        return false;
    }

    return true;
}

int main(int argc, char* argv[])
{
    connectDB();
    /*createTable();*/
    /*insertRecords();*/
    selectFromTable();
    updateTable();
    selectFromTable();
    closeDB();

    return 0;
}

sqlite学习笔记10:C语言中使用sqlite之查询和更新数据,布布扣,bubuko.com

时间: 2024-10-02 08:42:08

sqlite学习笔记10:C语言中使用sqlite之查询和更新数据的相关文章

C语言学习笔记:15_c语言中的进制操作.c

/* * 15_c语言中的进制操作.c * * Created on: 2015年7月5日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * c语言中的进制表示 * 前面加0b表示二进制 * 加0x表示十六进制 * 数字前加0表示八进制 * * printf按进制打印 * %d %i 以十进制打印 * %o 以八进制打印 * %x 以十六进制打印 * * %p 打印变量地址 * %f 打印小数 * %s

Hadoop学习笔记—10.Reduce阶段中的Shuffle过程

一.回顾Reduce阶段三大步凑 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步凑,其中在Reduce阶段总共三个步凑,如下图所示: 其中,Step2.1就是一个Shuffle操作,它针对多个map任务的输出按照不同的分区(Partition)通过网络复制到不同的reduce任务节点上,这个过程就称作为Shuffle. PS:Hadoop的shuffle过程就是从map端输出到reduce端输入之间的过程,这一段应该是Hadoop中最核心的部分,因为涉及到Had

【MongoDB学习笔记5】MongoDB中的创建、读取、更新、删除(CRUD)

数据库会用到创建(create)读取(find)更新(update)删除(remove),MongoDB也同样会用到: 一.创建 用insert函数将文档添加到集合中.例如 创建数据库blog,将文档增加到集合post中(先将文档放入post的变量中) > post={"title":"My blog post","context":"Here's my blog post","date":new D

sqlite学习笔记8:C语言中使用sqlite之创建表

前面已经说了如何打开和关闭数据库,这次要说得是如何执行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg) 参数: db:已经打开的数据库实例 sql:SQL语句,是一个字符串 callback:是一个回调函数 data:做为回调函数的第一个参数 errmsg:用于带回错误信息 该回调函数有两种返回值类型. 1.返回

sqlite学习笔记9:C语言中使用sqlite之插入数据

前面创建了一张表,现在给他插入一些数据,插入数据跟创建表差不多,仅仅是SQL语言不一样而已,完整代码如下: #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db" sqlite3 *db = NULL; char* sql = NULL; char *zErrMsg = NULL; int ret =

sqlite学习笔记11:C语言中使用sqlite之删除记录

最后一节,这里记录下如何删除数据. 前面所有的代码都继承在这里了,在Ubuntu14.04和Mac10.9上亲测通过. #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db" sqlite3 *db = NULL; char* sql = NULL; char *zErrMsg = NULL; con

sqlite学习笔记7:C语言中使用sqlite之打开数据库

数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打开数据库,假设数据库不存在则新建一个数据库,并打开 sqlite3_close(sqlite3*) 关闭数据库.假设关闭之前还存在没有运行完的语句,将会返回SQLITE_BUSY 二 实例 1 文件夹结构 Projects{ main.c// 代码所在文件 sqlite{// 官网下载下来的sqli

sqlite学习笔记7:C/C++中使用sqlite之打开数据库

数据库的基本内容前面都已经说得差不多了,接下看看怎样在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打开数据库,如果数据库不存在则新建一个数据库,并打开 sqlite3_close(sqlite3*) 关闭数据库,如果关闭之前还存在没有执行完的语句,将会返回SQLITE_BUSY 二 实例 1 目录结构 Projects{ main.c// 代码所在文件 sqlite{// 官网下载下来的sqlite压

Perl语言学习笔记 10 其他控制结构

1.unless控制结构 条件为假时执行,与if相反 可以附带else 2.Until控制结构 条件为假时执行,一直执行到条件为真: 3.条件修饰词 效果等同于: 类似的模式: 4.裸块控制结构 { body; body; .... } 有利于为临时变量圈定有效范围 5.elsif子句 6.自增.自减 同c语言 7.for 用法同c语言 8.for与foreach 在perl中,两者等价,优先选择纯正的foreach 9.5种循环块:for.foreach.while.until.裸块 last