1. /**************************************************************************
  2. * C语言SQLite3基本操作Demo
  3. * 声明:
  4. * 1. 本文仅仅是为了写一个C语言SQLite3的Demo;
  5. * 2. 本文并没有说明如何在终端下进入SQLite3创建数据库,也没有解释
  6. * sql语句的概念,仅仅给出了代码示例,这些内容需要你自己去
  7. * 资料。
  8. *
  9. * 2015-7-4 晴 深圳 南山平山村 曾剑锋
  10. *************************************************************************/
  11.  
  12. \\\\\\\-*- 目录-*-///////
  13. | 一、cat user.h
  14. | 二、cat user.c
  15. | 三、cat main.c
  16. | 四、cat Makefile
  17. | 五、cat user.sql
  18. \\\\\\\\\\\\\///////////
  19.  
  20. 一、cat user.h
  21. #ifndef __USER_H__
  22. #define __USER_H__
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <sqlite3.h>
  27. #include <string.h>
  28.  
  29. // 使用结构体来保存数据库中的数据
  30. typedef struct USER {
  31. char id[]; // 保存数据库中的id
  32. char name[]; // 姓名
  33. char password[]; // 密码
  34. char startTime[]; // 用户创建的开始时间
  35. struct USER* next; // 数据从数据库中提取出来是用链表保存
  36. } User;
  37.  
  38. // 查询user表Demo
  39. void userDemo(void);
  40. // 查询数据时的回调函数
  41. static int select_callback(void* data, int col_count, char** col_values, char** col_name);
  42. // 打印UserLinked链表
  43. void printUserLinked(User* userLinked);
  44. // 获取UserLinked链表
  45. User* getUserLinked(char* sql);
  46. // 释放链表中的数据
  47. void freeUserLinked(User* userLinked);
  48. // 更新数据库
  49. int updateUserDB(char* sql);
  50.  
  51. #endif
  52.  
  53. 二、cat user.c
  54. #include "user.h"
  55.  
  56. // 存放链表的表头
  57. static User* userLinkedHead = NULL;
  58. // 存放当前记录的结构体地址
  59. static User* userCurrent = NULL;
  60.  
  61. void userDemo(void){
  62. // 获取用户链表
  63. User* userLinked = getUserLinked("select * from user;");
  64. // 打印用户链表
  65. printUserLinked(userLinked);
  66. // 释放用户链表
  67. freeUserLinked(userLinked);
  68. }
  69.  
  70. // 查询数据库时的回调函数
  71. static int select_callback(void* data, int col_count, char** col_values, char** col_name){
  72. int i;
  73. userCurrent = calloc(, sizeof(User));
  74. for (i = ; i < col_count; i++) {
  75. if(strcmp(col_name[i], "id") == ){
  76. strcpy(userCurrent->id, col_values[i]);
  77. }
  78. if(strcmp(col_name[i], "name") == ){
  79. strcpy(userCurrent->name, col_values[i]);
  80. }
  81. if(strcmp(col_name[i], "password") == ){
  82. strcpy(userCurrent->password, col_values[i]);
  83. }
  84. if(strcmp(col_name[i], "startTime") == ){
  85. strcpy(userCurrent->startTime, col_values[i]);
  86. }
  87. }
  88. // 创建链表头
  89. if(userLinkedHead == NULL){
  90. userLinkedHead = userCurrent;
  91. return ;
  92. }
  93. // 采用头插的方式插入链表
  94. userCurrent->next = userLinkedHead->next;
  95. userLinkedHead->next = userCurrent;
  96.  
  97. return ;
  98. }
  99.  
  100. // 将链表中的数据打印出来
  101. void printUserLinked(User* userLinked){
  102. User* userCurrent = userLinked;
  103. while(userCurrent){
  104. printf("id = %s\n", userCurrent->id);
  105. printf("name = %s\n", userCurrent->name);
  106. printf("password = %s\n", userCurrent->password);
  107. printf("startTime = %s\n", userCurrent->startTime);
  108. userCurrent = userCurrent->next;
  109. }
  110. }
  111.  
  112. // 当程序退出的时候,要释放堆中的内存空间
  113. void freeUserLinked(User* userLinked){
  114. User* freeCurrent = userLinked;
  115. User* freePre = userLinked;
  116. while(freeCurrent){
  117. freeCurrent = freePre->next;
  118. free(freePre);
  119. freePre = freeCurrent;
  120. }
  121. userLinkedHead = NULL;
  122. }
  123.  
  124. // 通过传入查询sql字符串来获取查询的链表
  125. User* getUserLinked(char* sql){
  126. sqlite3 *db;
  127. sqlite3_open("./user.db", &db);
  128.  
  129. sqlite3_exec(db, sql, select_callback, , NULL);
  130.  
  131. sqlite3_close(db);
  132. db = ;
  133.  
  134. return userLinkedHead;
  135. }
  136.  
  137. // 通过sql来更新数据库
  138. int updateUserDB(char* sql){
  139. sqlite3 *db;
  140. sqlite3_open("./user.db", &db);
  141.  
  142. sqlite3_exec(db, sql, NULL, NULL, NULL);
  143.  
  144. sqlite3_close(db);
  145. db = ;
  146.  
  147. return ;
  148. }
  149.  
  150. 三、cat main.c
  151. #include "user.h"
  152.  
  153. int main(int argc, char** argv){
  154. userDemo();
  155. return ;
  156. }
  157.  
  158. 四、cat Makefile
  159. user: user.o main.o
  160. gcc user.o main.o -lsqlite3 -o user
  161.  
  162. user.o: user.h
  163. gcc -c user.c
  164.  
  165. main.o: user.h
  166. gcc -c main.c
  167.  
  168. clean:
  169. rm -rf *.o user
  170.  
  171. 五、cat user.sql
  172. #创建表,id为自动增长
  173. create table user (
  174. id integer PRIMARY KEY AUTOINCREMENT,
  175. name varchar(),
  176. password varchar(),
  177. startTime timestamp
  178. );
  179.  
  180. #插入初始值
  181. insert into user (name, password, startTime) values ('zjf', 'zjf', current_timestamp);
  182. insert into user (name, password, startTime) values ('lt', 'lt', current_timestamp);
  183. insert into user (name, password, startTime) values ('cyq', 'cyq', current_timestamp);
  184.  
  185. #查询
  186. select * from user;
  187. select * from user where name='zjf';
  188.  
  189. #日期的使用
  190. select date('now');
  191. select time('now');
  192. select datetime('now');
  193. select jolianday('now')-jolianday('1981-12-23');
  194. select strftime('%Y.%m.%d', 'now');
  195. select strftime('%Y.%m.%d', 'now', 'localtime');
  196.  
  197. #带日期的查询
  198. select id, name, password, date(startTime) from user;
  199. select id, name, password, time(startTime) from user;
  200. select id, name, password, datetime(startTime) from user;
  201.  
  202. #删除表
  203. drop table user;

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

  1. C语言指针基本操作

    C语言指针基本操作 指针  指针介绍 如果说C语言最有魅力的地方在哪,那么毋庸置疑,非指针莫属了. 众所周知,C语言中每个变量都有一个内存地址,可以通过&进行访问.指针是一个变量,它的值是一个 ...

  2. 【软件多国语言】一个demo

    之前上学的时候做过一个东西,需要中英文软件界面,并且需要随时可以切换,当时是师妹来做的,用的最直接也是最笨的办法, what? if(中文) { button1.Text = "花姑娘&qu ...

  3. ios在SQLite3基本操作

    iOS关于sqlite3操作 iPhone中支持通过sqlite3来訪问iPhone本地的数据库. 详细用法例如以下 1:加入开发包libsqlite3.0.dylib 首先是设置项目文件.在项目中加 ...

  4. sqlite3基本操作

    在移动设备上进行高性能高效率的大量数据存储,我们一般用得时sqlite这款轻巧型的数据库,这里介绍其增删改查基本功能 在ios开发中我们需要先导入"libsqlite3.dylib" ...

  5. Linux 中 sqlite3 基本操作

    https://www.runoob.com/sqlite/sqlite-commands.html 一 .linux 下安装数据库和创建一个数据库 1. Linux 下安装sqlite3 需要两个命 ...

  6. c语言二叉树基本操作

    编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...

  7. 转贴:C语言链表基本操作

    http://www.oschina.net/code/snippet_252667_27314#comments 这个代码有很多错误,估计是从老谭书上抄来但是很多还抄错了:对照老谭的书好好研究下.切 ...

  8. C语言文件基本操作

    1.用文本方式储存‘1’,‘0’,‘2’存入文件,然后用二进制方式从文件开头读出一个short型数据,并验证结果是否正确 #include<stdio.h> #include<str ...

  9. C语言文件读写Demo

    CIODemo.c #include <stdio.h> #include <time.h> #define INPUT_BUFFER_SIZE 100 * 1024 int ...

随机推荐

  1. highcharts PHP中使用

    官网 https://www.hcharts.cn/demo/highcharts html <div id="container" style="min-widt ...

  2. 爱阅app --- 答复功能改进建议

    共有四组评论,接下来一一答复. 第一组: 希望增加的功能: 1.希望能够继续完善书签功能,增加逐条删除书签功能. 2.能够在爱阅内部打开APP中提供的网址,用户选择一款阅读APP,当然不想每看一本新的 ...

  3. VS 2013 无法启动IIS Express Web 服务器

    之前程序好好的没什么问题,可是今天一大早来到公司后打开VS2013运行Web程序,然后就弹出提示信息:无法启动IIS Express Web 服务器,思来想去昨天都好好的,今天怎么会出现如此问题呢? ...

  4. js插件---GoJS 如何去水印

    js插件---GoJS 如何去水印 一.总结 一句话总结:把a.Kv=d[w.Jg("7eba17a4ca3b1a8346")][w.Jg("78a118b7" ...

  5. Coconuts, Revisited(递推+枚举+模拟)

    Description The short story titled Coconuts, by Ben Ames Williams, appeared in the Saturday Evening ...

  6. git上传文件到github与gulp的简单使用

    git有两种方式提交源代码到github 第一种方式通过地址提交下面介绍的是通过ssh方式上传 git使用ssh方式上传代码到githubgit首先要生成公钥和私钥 将公钥添加到github中将私钥保 ...

  7. BZOJ 1601 [Usaco2008 Oct]灌水 (最小生成树)

    题意 Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要 ...

  8. 多线程私有数据pthread_key_create

    参照:http://blog.csdn.net/xiaohuangcat/article/details/18267561 在多线程的环境下,进程内的所有线程共享进程的数据空间.因此全局变量为所有线程 ...

  9. java反编译工具eclipse插件jad的使用

    https://www.cnblogs.com/zhikou/p/8098137.html 这边文章主要介绍如何使用Eclipse的插件jad进行反编译,在查看一些jar包里面的class文件时,就可 ...

  10. openshift rhc

    Microsoft Windows [Version 6.1.7601]Copyright (c) 2009 Microsoft Corporation. All rights reserved. C ...