C语言SQLite3基本操作Demo

/**************************************************************************
 *                     C语言SQLite3基本操作Demo
 * 声明:
 *      1. 本文仅仅是为了写一个C语言SQLite3的Demo;
 *      2. 本文并没有说明如何在终端下进入SQLite3创建数据库,也没有解释
 *          sql语句的概念,仅仅给出了代码示例,这些内容需要你自己去
 *          资料。
 *
 *                                  2015-7-4 晴 深圳 南山平山村 曾剑锋
 *************************************************************************/

                       \\\\\\\-*- 目录-*-///////
                       |  一、cat user.h
                       |  二、cat user.c
                       |  三、cat main.c
                       |  四、cat Makefile
                       |  五、cat user.sql
                       \\\\\\\\\\\\\///////////

一、cat user.h
    #ifndef __USER_H__
        #define __USER_H__

        #include <stdio.h>
        #include <stdlib.h>
        #include <sqlite3.h>
        #include <string.h>

        // 使用结构体来保存数据库中的数据
        typedef struct USER {
            char id[4];             // 保存数据库中的id
            char name[20];          // 姓名
            char password[20];      // 密码
            char startTime[20];     // 用户创建的开始时间
            struct USER* next;      // 数据从数据库中提取出来是用链表保存
        } User;

        // 查询user表Demo
        void userDemo(void);
        // 查询数据时的回调函数
        static int select_callback(void* data, int col_count, char** col_values, char** col_name);
        // 打印UserLinked链表
        void printUserLinked(User* userLinked);
        // 获取UserLinked链表
        User* getUserLinked(char* sql);
        // 释放链表中的数据
        void freeUserLinked(User* userLinked);
        // 更新数据库
        int updateUserDB(char* sql);

    #endif

二、cat user.c
    #include "user.h"

    // 存放链表的表头
    static User* userLinkedHead = NULL;
    // 存放当前记录的结构体地址
    static User* userCurrent = NULL;

    void userDemo(void){
        // 获取用户链表
        User* userLinked = getUserLinked("select * from user;");
        // 打印用户链表
        printUserLinked(userLinked);
        // 释放用户链表
        freeUserLinked(userLinked);
    }

    // 查询数据库时的回调函数
    static int select_callback(void* data, int col_count, char** col_values, char** col_name){
        int i;
        userCurrent = calloc(1, sizeof(User));
        for (i = 0; i < col_count; i++) {
            if(strcmp(col_name[i], "id") == 0){
                strcpy(userCurrent->id, col_values[i]);
            }
            if(strcmp(col_name[i], "name") == 0){
                strcpy(userCurrent->name, col_values[i]);
            }
            if(strcmp(col_name[i], "password") == 0){
                strcpy(userCurrent->password, col_values[i]);
            }
            if(strcmp(col_name[i], "startTime") == 0){
                strcpy(userCurrent->startTime, col_values[i]);
            }
        }
        // 创建链表头
        if(userLinkedHead == NULL){
            userLinkedHead = userCurrent;
            return 0;
        }
        // 采用头插的方式插入链表
        userCurrent->next = userLinkedHead->next;
        userLinkedHead->next = userCurrent;

        return 0;
    }

    // 将链表中的数据打印出来
    void printUserLinked(User* userLinked){
        User* userCurrent = userLinked;
        while(userCurrent){
            printf("id = %s\n", userCurrent->id);
            printf("name = %s\n", userCurrent->name);
            printf("password = %s\n", userCurrent->password);
            printf("startTime = %s\n", userCurrent->startTime);
            userCurrent = userCurrent->next;
        }
    }

    // 当程序退出的时候,要释放堆中的内存空间
    void freeUserLinked(User* userLinked){
        User* freeCurrent = userLinked;
        User* freePre = userLinked;
        while(freeCurrent){
            freeCurrent = freePre->next;
            free(freePre);
            freePre = freeCurrent;
        }
        userLinkedHead = NULL;
    }

    // 通过传入查询sql字符串来获取查询的链表
    User* getUserLinked(char* sql){
        sqlite3 *db;
        sqlite3_open("./user.db", &db);

        sqlite3_exec(db, sql, select_callback, 0, NULL);  

        sqlite3_close(db);
        db = 0;

        return userLinkedHead;
    }

    // 通过sql来更新数据库
    int updateUserDB(char* sql){
        sqlite3 *db;
        sqlite3_open("./user.db", &db);

        sqlite3_exec(db, sql, NULL, NULL, NULL);  

        sqlite3_close(db);
        db = 0;

        return 0;
    }

三、cat main.c
    #include "user.h"

    int main(int argc, char** argv){
        userDemo();
        return 0;
    }

四、cat Makefile
    user: user.o main.o
        gcc user.o main.o -lsqlite3 -o user

    user.o: user.h
        gcc -c user.c

    main.o: user.h
        gcc -c main.c

    clean:
        rm -rf *.o user

五、cat user.sql
    #创建表,id为自动增长
    create table user (
        id integer PRIMARY KEY AUTOINCREMENT,
        name varchar(20),
        password varchar(20),
        startTime timestamp
    );

    #插入初始值
    insert into user (name, password, startTime) values (‘zjf‘, ‘zjf‘, current_timestamp);
    insert into user (name, password, startTime) values (‘lt‘, ‘lt‘, current_timestamp);
    insert into user (name, password, startTime) values (‘cyq‘, ‘cyq‘, current_timestamp);

    #查询
    select * from user;
    select * from user where name=‘zjf‘;

    #日期的使用
    select date(‘now‘);
    select time(‘now‘);
    select datetime(‘now‘);
    select jolianday(‘now‘)-jolianday(‘1981-12-23‘);
    select strftime(‘%Y.%m.%d‘, ‘now‘);
    select strftime(‘%Y.%m.%d‘, ‘now‘, ‘localtime‘);

    #带日期的查询
    select id, name, password, date(startTime) from user;
    select id, name, password, time(startTime) from user;
    select id, name, password, datetime(startTime) from user;

    #删除表
    drop table user;
时间: 2024-10-21 10:43:31

C语言SQLite3基本操作Demo的相关文章

C语言指针基本操作

C语言指针基本操作 指针 指针介绍 如果说C语言最有魅力的地方在哪,那么毋庸置疑,非指针莫属了. 众所周知,C语言中每个变量都有一个内存地址,可以通过&进行访问.指针是一个变量,它的值是一个变量的内存地址[注意是内存地址]. 指针表达式: type *var-name; //其中type代表C语言的数据类型,例如:int,double,char,float 指针 指针声明 指针进行声明时,=的右边必须为内存地址,不可以是变量(但是int*p=0;除外,该语句表示指针为空) 指针初始化 在初始化指

iOS 数据持久化之CoreData(二)堆栈建立和基本操作Demo

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言:本文会通过一个完整的工程创建,讲解 CoreData的堆栈创建 四种基本的操作(查询,创建,删除,更新) 简单的MVC设计 如何使用Block传递Action,缩减代码量 再CoreData使用类别扩展NSManagedObject方法 Demo下载 ht

R语言的基本操作--读取和写入txt,sapply&amp;lapply

最近比较忙比较忙比较忙...真是忙/// 作为菜鸟,不明白为什么这么容易忘记r的基本操作,感觉比C# JAVA c什么的都难,又来复习一遍 1 ##数据操作的入门 2 3 ##定义一个函数判断偶数 4 func <- function(x) 5 { 6 if(x %% 2 == 0){ 7 ret <- 'even' 8 }else 9 { 10 ret <- 'odd' 11 } 12 return(ret) 13 } 14 15 ##测试效果 16 func(35) 17 18 ##

C语言文本文件基本操作

#include<stdio.h> #include<stdlib.h> ///定义学生结点 typedef struct node { char name[20]; float CScore; float DataBaseScore; }Student; //键盘输入学生信息 Student* ScanStudent(int n) { Student *studentArr=(Student*)malloc(sizeof(Student)*n); for(int i=0;i<

c#调用脚本语言Lua——简单Demo

配置: 1. 下载c#下的Lua支持类库.下载地址:http://files.luaforge.net/releases/luainterface/luainterface/2.0.3 将(lua51.dll\LuaInterface.dll)引用自己的项目中. 2. 修改App.config添加以下内容: <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup

ios在SQLite3基本操作

iOS关于sqlite3操作 iPhone中支持通过sqlite3来訪问iPhone本地的数据库. 详细用法例如以下 1:加入开发包libsqlite3.0.dylib 首先是设置项目文件.在项目中加入iPhone版的sqlite3的数据库的开发包.在项目下的Frameworks点击右键.然后选择libsqlite3.0.dylib文件. libsqlite3.0.dylib文件地址: /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/i

如何使用C语言SQLite3编程?大一课程设计看这里!

本程序由main.c和ops.h构成: main.c是源代码文件,包含主要业务逻辑. ops.h是自定义头文件,实现所有的方法. sqlite3.dll是库文件 sq;ite3.h.sqlite3.c是官方提供的源代码文件和库文件. sqlite.exe用来操作生成的数据库文件. less.bat是个文本查看器 main.c代码: #include <stdio.h> #include <stdlib.h> #include "ops.h" /* run thi

单链表(C语言)基本操作

单链表:单向有序链表 最后置于空 #pragma once #include<string.h> #include<malloc.h> #include<assert.h> typedef int DataType; typedef struct ListNode { struct ListNode *_next; DataType _data; }ListNode; void PrintList(ListNode *&pHead) { while(pHead)

C语言-文件基本操作

1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 using namespace std; 5 #define FILENAME "E:\\FUSHI\\test.txt" 6 7 int main() 8 { 9 /* 10 新建文件,并写文件 11 FILE *fp; 12 char f_name[30]; 13 char choise,in_char; 14 1