CRUD

struct student

  1. typedef struct STUDENT {
  2. unsigned int id;
  3. unsigned char name[16];
  4. unsigned int age;
  5. unsigned char address[64];
  6. } Student;

create table

  1. CREATE TABLE IF NOT EXISTS student(
  2. `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  3. `name` TEXT NOT NULL,
  4. `age` INT NOT NULL,
  5. `address` TEXT NOT NULL
  6. )
  1. int createTable(sqlite3 *db) {
  2. char *result = {0};
  3. char *sql = "CREATE TABLE IF NOT EXISTS student("\
  4. "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," \
  5. "`name` TEXT NOT NULL," \
  6. "`age` INT NOT NULL," \
  7. "`address` TEXT NOT NULL);";
  8. int r = sqlite3_exec(db, sql, NULL, 0, &result);
  9. if (r == SQLITE_OK) {
  10. printf("create table success!\n");
  11. }
  12. return r;
  13. }

generate student data

  1. void generateStudent(Student *student, int count) {
  2. // int count = 100;
  3. // Student student[count];
  4. int i = 0;
  5. for (; i < count; i++) {
  6. unsigned char name[16] = {0};
  7. unsigned char address[64] = {0};
  8. sprintf((char *) name, "zing%d", i);
  9. sprintf((char *) address, "jiangsu-wuxi-%d", i);
  10. student[i].id = (unsigned int) (1000 + i);
  11. memcpy(student[i].name, name, sizeof(name));
  12. student[i].age = (unsigned int) (10 + i);
  13. memcpy(student[i].address, address, sizeof(address));
  14. printf("%d-%s-%d-%s\n", student[i].id, student[i].name, student[i].age, student[i].address);
  15. }
  16. // printf("----------==ok---------\n");
  17. // for (i = 0; i < count; ++i) {
  18. // printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age, student[i].address);
  19. // }
  20. }

insert table

  1. int insertTable(sqlite3 *db, Student student) {
  2. char sql[128], *result = {0};
  3. sprintf(sql, "INSERT INTO student (`name`,`age`,`address`) VALUES('%s','%d','%s')", student.name, student.age,
  4. student.address);
  5. int rc = sqlite3_exec(db, sql, NULL, 0, &result);
  6. if (rc != SQLITE_OK) {
  7. fprintf(stderr, "SQL error: %s\n", result);
  8. sqlite3_free(result);
  9. } else {
  10. printf("insert ok!\n");
  11. }
  12. return rc;
  13. }

query table 1

  1. int queryTable(sqlite3 *db, Student *student, int index, int count) {
  2. char sql[128];
  3. if (count > 10)
  4. count = 10;
  5. sprintf(sql, "select * from student order by id desc limit %d,%d", index, count);
  6. printf("%s\n", sql);
  7. char *err = NULL;
  8. int col, row, i, j = 0;
  9. char **result;
  10. int rs = sqlite3_get_table(db, sql, &result, &row, &col, &err);
  11. if (rs == SQLITE_OK) {
  12. printf("row %d, col %d\n", row, col);
  13. // id-name-age-address
  14. // printf("%s-%s-%s-%s\n", result[0], result[1], result[2], result[3]);
  15. // 1-zing0-10-jiangsu-wuxi-0
  16. // printf("%s-%s-%s-%s\n", result[4], result[5], result[6], result[7]);
  17. // printf("%s-%s-%s-%s\n", result[1120], result[1121], result[1122], result[1123]);
  18. // for (i = 0; i < (row + 1) * col; i++) {
  19. // printf("%s\n", result[i]);
  20. // }
  21. for (i = 0; i < (row + 1) * col; i++) {
  22. if (i % col == 0 && i >= col) {
  23. student[j].id = (unsigned int) atoi(result[i]);
  24. memcpy(student[j].name, result[i + 1], sizeof(student[i].name));
  25. student[j].age = (unsigned int) atoi(result[i + 2]);
  26. memcpy(student[j].address, result[i + 3], sizeof(student[i].address));
  27. // printf("id:%d,name:%s,age:%d,address:%s\n", student[j].id, student[j].name, student[j].age, student[j].address);
  28. // printf("id:%s,name:%s,age:%s,address:%s\n", result[i], result[i + 1], result[i + 2], result[i + 3]);
  29. j++;
  30. }
  31. }
  32. } else {
  33. printf("error\n");
  34. }
  35. return rs;
  36. }

query table 2

  1. /*
  2. * @param stu
  3. * @param argc
  4. * @param argv
  5. * @param azColName
  6. * @return
  7. */
  8. int queryCallback(void *stu, int argc, char **argv, char **azColName) {
  9. static int j;
  10. Student *student = stu;
  11. student[j].id = (unsigned int) atoi(argv[0]);
  12. memcpy(student[j].name, argv[1], sizeof(student[j].name));
  13. student[j].age = (unsigned int) atoi(argv[2]);
  14. memcpy(student[j].address, argv[3], sizeof(student[j].address));
  15. j++;
  16. // printf("\n");
  17. // for (i = 0; i < argc; i++) {
  18. // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  19. // }
  20. // printf("argc-->%d\n",argc);
  21. return 0;
  22. }
  23. int query(sqlite3 *db, Student *student, int index, int count) {
  24. char sql[128];
  25. sprintf(sql, "select * from student order by id desc limit %d,%d;", index, count);
  26. char **err = NULL;
  27. return sqlite3_exec(db, sql, queryCallback, student, err);
  28. }

update table

  1. int update(sqlite3 *db, Student student) {
  2. char sql[128];
  3. sprintf(sql, "UPDATE student set address = '%s' where ID=%d;", student.address, student.id);
  4. char *err = NULL;
  5. /* Execute SQL statement */
  6. int rc = sqlite3_exec(db, sql, NULL, (void *) 0, &err);
  7. if (rc != SQLITE_OK) {
  8. fprintf(stderr, "SQL error: %s\n", err);
  9. sqlite3_free(err);
  10. } else {
  11. fprintf(stdout, "Operation done successfully\n");
  12. }
  13. return rc;
  14. }
  15. int update2(sqlite3 *db, int id, char *address) {
  16. char sql[128];
  17. sprintf(sql, "UPDATE student set address = '%s' where ID=%d;", address, id);
  18. char *err = NULL;
  19. /* Execute SQL statement */
  20. int rc = sqlite3_exec(db, sql, NULL, (void *) 0, &err);
  21. if (rc != SQLITE_OK) {
  22. fprintf(stderr, "SQL error: %s\n", err);
  23. sqlite3_free(err);
  24. } else {
  25. fprintf(stdout, "Operation done successfully\n");
  26. }
  27. return rc;
  28. }
  29. int update3(sqlite3 *db, void *data) {
  30. Student *student = (Student *) data;
  31. printf("--> %d\n", student->id);
  32. printf("--> %s\n", student->address);
  33. char sql[128];
  34. sprintf(sql, "UPDATE student set address = '%s' where ID=%d;", student->address, student->id);
  35. char *err = NULL;
  36. /* Execute SQL statement */
  37. int rc = sqlite3_exec(db, sql, NULL, (void *) 0, &err);
  38. if (rc != SQLITE_OK) {
  39. fprintf(stderr, "SQL error: %s\n", err);
  40. sqlite3_free(err);
  41. } else {
  42. fprintf(stdout, "Operation done successfully\n");
  43. }
  44. return rc;
  45. }

main test

  1. int main() {
  2. int i = 0;
  3. const char *name = "test.db";
  4. sqlite3 *db;
  5. int count = 10;
  6. Student student[count];
  7. int r = sqlite3_open(name, &db);
  8. if (r == 0) {
  9. printf("open sb success\n");
  10. }
  11. // generateStudent(student, count);
  12. // printf("----------==ok---------\n");
  13. // for (i = 0; i < count; ++i) {
  14. // printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age, student[i].address);
  15. // }
  16. // createTable(db);
  17. // for (i = 0; i < count; ++i) {
  18. // insertTable(db, student[i]);
  19. // }
  20. if (queryTable(db, student, 2, 10) == SQLITE_OK) {
  21. for (i = 0; i < count; ++i) {
  22. printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  23. student[i].address);
  24. }
  25. }
  26. Student stu;
  27. stu.id = 68;
  28. char *address = "jiangsu-xuzhou";
  29. memcpy(stu.address, address, strlen(address));
  30. update(db, stu);
  31. queryTable(db, student, 0, 10);
  32. for (i = 0; i < count; ++i) {
  33. printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  34. student[i].address);
  35. }
  36. update2(db, 69, address);
  37. queryTable(db, student, 0, 10);
  38. for (i = 0; i < count; ++i) {
  39. printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  40. student[i].address);
  41. }
  42. address = "jiangsu-suzhou";
  43. stu.id = 70;
  44. memcpy(stu.address, address, strlen(address));
  45. update3(db, &stu);
  46. if (queryTable(db, student, 0, 10)) {
  47. for (i = 0; i < count; ++i) {
  48. printf("update3-> id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  49. student[i].address);
  50. }
  51. }
  52. memset(student, 0, sizeof(student));
  53. if (query(db, student, 0, 10) == SQLITE_OK) {
  54. for (i = 0; i < count; ++i) {
  55. printf("update-> id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  56. student[i].address);
  57. }
  58. }
  59. sqlite3_close(db);
  60. return 0;
  61. }

all code

  1. //
  2. // Created by zhangrongxiang on 2018/2/23 14:10
  3. // File sql
  4. //
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <sqlite3.h>
  9. int queryCallback(void *stu, int argc, char **argv, char **azColName);
  10. typedef struct STUDENT {
  11. unsigned int id;
  12. unsigned char name[16];
  13. unsigned int age;
  14. unsigned char address[64];
  15. } Student;
  16. void generateStudent(Student *student, int count) {
  17. // int count = 100;
  18. // Student student[count];
  19. int i = 0;
  20. for (; i < count; i++) {
  21. unsigned char name[16] = {0};
  22. unsigned char address[64] = {0};
  23. sprintf((char *) name, "zing%d", i);
  24. sprintf((char *) address, "jiangsu-wuxi-%d", i);
  25. student[i].id = (unsigned int) (1000 + i);
  26. memcpy(student[i].name, name, sizeof(name));
  27. student[i].age = (unsigned int) (10 + i);
  28. memcpy(student[i].address, address, sizeof(address));
  29. printf("%d-%s-%d-%s\n", student[i].id, student[i].name, student[i].age, student[i].address);
  30. }
  31. // printf("----------==ok---------\n");
  32. // for (i = 0; i < count; ++i) {
  33. // printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age, student[i].address);
  34. // }
  35. }
  36. int createTable(sqlite3 *db) {
  37. char *result = {0};
  38. char *sql = "CREATE TABLE IF NOT EXISTS student("\
  39. "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," \
  40. "`name` TEXT NOT NULL," \
  41. "`age` INT NOT NULL," \
  42. "`address` TEXT NOT NULL);";
  43. // *table = *sql;
  44. int r = sqlite3_exec(db, sql, NULL, 0, &result);
  45. if (r == SQLITE_OK) {
  46. printf("create table success!\n");
  47. }
  48. return r;
  49. }
  50. int insertTable(sqlite3 *db, Student student) {
  51. char sql[128], *result = {0};
  52. sprintf(sql, "INSERT INTO student (`name`,`age`,`address`) VALUES('%s','%d','%s')", student.name, student.age,
  53. student.address);
  54. int rc = sqlite3_exec(db, sql, NULL, 0, &result);
  55. if (rc != SQLITE_OK) {
  56. fprintf(stderr, "SQL error: %s\n", result);
  57. sqlite3_free(result);
  58. } else {
  59. printf("insert ok!\n");
  60. }
  61. return rc;
  62. }
  63. /*
  64. * @param stu
  65. * @param argc
  66. * @param argv
  67. * @param azColName
  68. * @return
  69. */
  70. int queryCallback(void *stu, int argc, char **argv, char **azColName) {
  71. static int j;
  72. Student *student = stu;
  73. student[j].id = (unsigned int) atoi(argv[0]);
  74. memcpy(student[j].name, argv[1], sizeof(student[j].name));
  75. student[j].age = (unsigned int) atoi(argv[2]);
  76. memcpy(student[j].address, argv[3], sizeof(student[j].address));
  77. j++;
  78. // printf("\n");
  79. // for (i = 0; i < argc; i++) {
  80. // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  81. // }
  82. // printf("argc-->%d\n",argc);
  83. return 0;
  84. }
  85. int query(sqlite3 *db, Student *student, int index, int count) {
  86. char sql[128];
  87. sprintf(sql, "select * from student order by id desc limit %d,%d;", index, count);
  88. char **err = NULL;
  89. return sqlite3_exec(db, sql, queryCallback, student, err);
  90. }
  91. int queryTable(sqlite3 *db, Student *student, int index, int count) {
  92. char sql[128];
  93. if (count > 10)
  94. count = 10;
  95. sprintf(sql, "select * from student order by id desc limit %d,%d", index, count);
  96. printf("%s\n", sql);
  97. char *err = NULL;
  98. int col, row, i, j = 0;
  99. char **result;
  100. int rs = sqlite3_get_table(db, sql, &result, &row, &col, &err);
  101. if (rs == SQLITE_OK) {
  102. printf("row %d, col %d\n", row, col);
  103. // id-name-age-address
  104. // printf("%s-%s-%s-%s\n", result[0], result[1], result[2], result[3]);
  105. // 1-zing0-10-jiangsu-wuxi-0
  106. // printf("%s-%s-%s-%s\n", result[4], result[5], result[6], result[7]);
  107. // printf("%s-%s-%s-%s\n", result[1120], result[1121], result[1122], result[1123]);
  108. // for (i = 0; i < (row + 1) * col; i++) {
  109. // printf("%s\n", result[i]);
  110. // }
  111. for (i = 0; i < (row + 1) * col; i++) {
  112. if (i % col == 0 && i >= col) {
  113. student[j].id = (unsigned int) atoi(result[i]);
  114. memcpy(student[j].name, result[i + 1], sizeof(student[i].name));
  115. student[j].age = (unsigned int) atoi(result[i + 2]);
  116. memcpy(student[j].address, result[i + 3], sizeof(student[i].address));
  117. // printf("id:%d,name:%s,age:%d,address:%s\n", student[j].id, student[j].name, student[j].age, student[j].address);
  118. // printf("id:%s,name:%s,age:%s,address:%s\n", result[i], result[i + 1], result[i + 2], result[i + 3]);
  119. j++;
  120. }
  121. }
  122. } else {
  123. printf("error\n");
  124. }
  125. return rs;
  126. }
  127. int update(sqlite3 *db, Student student) {
  128. char sql[128];
  129. sprintf(sql, "UPDATE student set address = '%s' where ID=%d;", student.address, student.id);
  130. char *err = NULL;
  131. /* Execute SQL statement */
  132. int rc = sqlite3_exec(db, sql, NULL, (void *) 0, &err);
  133. if (rc != SQLITE_OK) {
  134. fprintf(stderr, "SQL error: %s\n", err);
  135. sqlite3_free(err);
  136. } else {
  137. fprintf(stdout, "Operation done successfully\n");
  138. }
  139. return rc;
  140. }
  141. int update2(sqlite3 *db, int id, char *address) {
  142. char sql[128];
  143. sprintf(sql, "UPDATE student set address = '%s' where ID=%d;", address, id);
  144. char *err = NULL;
  145. /* Execute SQL statement */
  146. int rc = sqlite3_exec(db, sql, NULL, (void *) 0, &err);
  147. if (rc != SQLITE_OK) {
  148. fprintf(stderr, "SQL error: %s\n", err);
  149. sqlite3_free(err);
  150. } else {
  151. fprintf(stdout, "Operation done successfully\n");
  152. }
  153. return rc;
  154. }
  155. int update3(sqlite3 *db, void *data) {
  156. Student *student = (Student *) data;
  157. printf("--> %d\n", student->id);
  158. printf("--> %s\n", student->address);
  159. char sql[128];
  160. sprintf(sql, "UPDATE student set address = '%s' where ID=%d;", student->address, student->id);
  161. char *err = NULL;
  162. /* Execute SQL statement */
  163. int rc = sqlite3_exec(db, sql, NULL, (void *) 0, &err);
  164. if (rc != SQLITE_OK) {
  165. fprintf(stderr, "SQL error: %s\n", err);
  166. sqlite3_free(err);
  167. } else {
  168. fprintf(stdout, "Operation done successfully\n");
  169. }
  170. return rc;
  171. }
  172. int main() {
  173. int i = 0;
  174. const char *name = "test.db";
  175. sqlite3 *db;
  176. int count = 10;
  177. Student student[count];
  178. int r = sqlite3_open(name, &db);
  179. if (r == 0) {
  180. printf("open sb success\n");
  181. }
  182. // generateStudent(student, count);
  183. // printf("----------==ok---------\n");
  184. // for (i = 0; i < count; ++i) {
  185. // printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age, student[i].address);
  186. // }
  187. // createTable(db);
  188. // for (i = 0; i < count; ++i) {
  189. // insertTable(db, student[i]);
  190. // }
  191. if (queryTable(db, student, 2, 10) == SQLITE_OK) {
  192. for (i = 0; i < count; ++i) {
  193. printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  194. student[i].address);
  195. }
  196. }
  197. Student stu;
  198. stu.id = 68;
  199. char *address = "jiangsu-xuzhou";
  200. memcpy(stu.address, address, strlen(address));
  201. update(db, stu);
  202. queryTable(db, student, 0, 10);
  203. for (i = 0; i < count; ++i) {
  204. printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  205. student[i].address);
  206. }
  207. update2(db, 69, address);
  208. queryTable(db, student, 0, 10);
  209. for (i = 0; i < count; ++i) {
  210. printf("id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  211. student[i].address);
  212. }
  213. address = "jiangsu-suzhou";
  214. stu.id = 70;
  215. memcpy(stu.address, address, strlen(address));
  216. update3(db, &stu);
  217. if (queryTable(db, student, 0, 10)) {
  218. for (i = 0; i < count; ++i) {
  219. printf("update3-> id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  220. student[i].address);
  221. }
  222. }
  223. memset(student, 0, sizeof(student));
  224. if (query(db, student, 0, 10) == SQLITE_OK) {
  225. for (i = 0; i < count; ++i) {
  226. printf("update-> id:%d,name:%s,age:%d,address:%s\n", student[i].id, student[i].name, student[i].age,
  227. student[i].address);
  228. }
  229. }
  230. sqlite3_close(db);
  231. return 0;
  232. }

See

All rights reserved

C 扩展库 - sqlite3 API CRUD的更多相关文章

  1. C 扩展库 - sqlite3 API

    sqlite3 API Summary sqlite3 The database connection object. Created by sqlite3_open() and destroyed ...

  2. C 扩展库 - mysql API CRUD

    CRUD table create table if not exists `student` ( `id` int auto_increment, `name` varchar(16) not nu ...

  3. C 扩展库 - mysql API

    MySQL API C API Data Structures MYSQL This structure represents handler for one database connection. ...

  4. C 扩展库 - mysql API general outline

    Application programs should use this general outline for interacting with MySQL Initialize the MySQL ...

  5. 【小结】有关mysql扩展库和mysqli扩展库的crud操作封装

    现阶段php如果要操作mysql数据库 php给我们提供了3套库 1.mysql扩展库   面向过程操作 2.mysqli扩展库  面向对象操作和面向过程操作并存  安全性和效率高于mysql扩展库 ...

  6. 安装php扩展库

    无法加载'pdo_mysql' ,因为需要pdo这个module.PHP Warning: Cannot load module 'pdo_mysql' because required module ...

  7. 『Python CoolBook』C扩展库_其一_用法讲解

    不依靠其他工具,直接使用Python的扩展API来编写一些简单的C扩展模块. 本篇参考PythonCookbook第15节和Python核心编程完成,值得注意的是,Python2.X和Python3. ...

  8. php数据库编程---mysql扩展库

    1, Java有一种方式操作数据库, PHP有三种方式来操作mysql数据库.(1)mysql扩展库:(2)mysqli扩展库:(3)pdo: 2, mysql扩展库和mysql数据库区别 3, my ...

  9. GLEW扩展库【转】

    http://blog.sina.com.cn/s/blog_4aff14d50100ydsy.html 一.关于GLEW扩展库: GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用O ...

随机推荐

  1. FMX.Platform.TApplicationEvent

    FMX.Platform.TApplicationEvent http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Platform.TApp ...

  2. Unity3d发布的iOS产品中使用GB2312字符编码(CP936)

    最近在开发中要用到GB2312字符编码(CP936),在C#代码中便有了如此代码 System.Text.Encoding.GetEncoding() 这在Unity3d 编辑器下运行没有任何问题,打 ...

  3. [Elixir003] Mix Archives

    在[Elixir001]中使用 mix escript.build 生成一个lifelog 的escript启动脚本. 今天我们尝试一下另一种方式:生成Archives. 我们先添加一个Task 1. ...

  4. 如何在TortoiseGit中使用ssh-keygen生成的key

    再windows 用TortoiseGit 时,git clone 项目时 提示 "Couldn't load this key (OpenSSH SSH-2 private key),如下 ...

  5. visualstudio部分快捷键

    [工具快捷键] Ctrl+Shift+N: 新建项目 Ctrl+Shift+O: 打开项目 Ctrl+Shift+S: 全部保存 Shift+Alt+C: 新建类 Ctrl+Shift+A: 新建项 ...

  6. UDP实现一个简易的聊天室 (Unity&&C#完成)

    效果展示(尚未完善) UDP User Data Protocol 用户数据报协议 概述 UDP是不连接的数据报模式.即传输数据之前源端和终端不建立连接.使用尽最大努力交付原则,即不保证可靠交付. 数 ...

  7. python网络编程--粘包解决方案 和 subprocess模块

    1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...

  8. python 项目自动生成 requirements.txt 文件

    生成 requirements.txt 文件的目的: 安装 pthon 项目时需要把此项目所有依赖的第三方包安装完成.项目依赖的第三方包统一放到 requirements.txt 文件中即可. 怎么自 ...

  9. 如何给LOJ补全special judge

    首先你要会写一个叫$data.yml$的东西, 这里面记录了这道题的$subtask$计分策略 也告诉了评测姬这道题是提交答案还是$spj$还是交互题 那么,$YAML$语言是啥啊? 别问我,我也不会 ...

  10. 脚本:定时释放 Linux/CentOS 缓存【转载自:杭州山不高】

    定时释放Linux/CentOS缓存的脚本(yl_dropcaches)如下: #!/bin/bash used=`free -m | awk 'NR==2' | awk '{print $3}'` ...