首先pThread 不是linux系统默认库,连接的时候需要使用库libpthread.a.
加入-lpthread参数。另外会有lopen什么找不到的情况。加入-ldl
指定目录。Project__targets options___C/C++ parser option
C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理(创建数据库、创建表格、插入数据、查询、数据、删除数据等)。

首先要编译好
sqlite的库文件 :
      libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig
可执行文件 : 
      sqlite3

本次测试:
      sqlite3的库文件目录是:/usr/local/lib
      可执行文件 sqlite3 的目录是: /usr/local/bin
      头文件 sqlite3.h 的目录是: /usr/local/include

用ls命令查看如下:
[root@localhost config]# ls /usr/local/lib
libclamav.a         libclamunrar_iface.a         libclamunrar.so        libsqlite3.so
libclamav.la        libclamunrar_iface.la        libclamunrar.so.5      libsqlite3.so.0
libclamav.so        libclamunrar_iface.so        libclamunrar.so.5.0.3  libsqlite3.so.0.8.6
libclamav.so.5      libclamunrar_iface.so.5      libmstring.so          pkgconfig
libclamav.so.5.0.3  libclamunrar_iface.so.5.0.3  libsqlite3.a
libclamunrar.a      libclamunrar.la              libsqlite3.la

此目录下包含库文件:
      libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig

开始sqlite编程:
      1. 下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C++ 接口. 数据库的名字由第一个参数取得且第个参数或更多的参数是 SQL 执行语句. 
      这个函数调用sqlite3_open() 打开数据库,并且调用sqlite3_close() 关闭数据库连接。
      程序一:opendbslite.c: 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sqlite3.h>
  4. int main( void )
  5. {
  6. sqlite3 *db=NULL;
  7. char *zErrMsg = 0;
  8. int rc;
  9. //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
  10. rc = sqlite3_open("zieckey.db", &db);
  11. if( rc )
  12. {
  13. fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
  14. sqlite3_close(db);
  15. exit(1);
  16. }
  17. else printf("You have opened a sqlite3 database named zieckey.db successfully!/nCongratulations! Have fun !  ^-^ /n");
  18. sqlite3_close(db); //关闭数据库
  19. return 0;
  20. }

编译(问题):
[root@localhost liuxltest]# gcc -o opendbsqlite opendbsqlite.c 
/tmp/ccuquUQN.o: In function `main':
opendbsqlite.c:(.text+0x2e): undefined reference to `sqlite3_open'
opendbsqlite.c:(.text+0x42): undefined reference to `sqlite3_errmsg'
opendbsqlite.c:(.text+0x67): undefined reference to `sqlite3_close'
opendbsqlite.c:(.text+0x8a): undefined reference to `sqlite3_close'
collect2: ld returned 1 exit status

编译(解决):
出现上述问题是因为没有找到库文件的问题。
由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:
[root@localhost liuxltest]# gcc -o opendbsqlite opendbsqlite.c -lsqlite3
用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )
执行:
[root@localhost liuxltest]# ./opendbsqlite 
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun !  ^-^ 
[root@localhost liuxltest]#

2. 插入 :insert 
      在C语言中向数据库插入数据:
sqlite3_exec的函数原型说明如下:
int sqlite3_exec(
  sqlite3*,                     /* An open database */
  const char *sql,              /* SQL to be executed */
  sqlite_callback,              /* Callback function */
  void *,                       /* 1st argument to callback function */
  char **errmsg                 /* Error msg written here */
);

程序二:insert.c:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "sqlite3.h"
  4. #define _DEBUG_
  5. int main( void )
  6. {
  7. sqlite3 *db=NULL;
  8. char *zErrMsg = 0;
  9. int rc;
  10. rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
  11. if( rc )
  12. {
  13. fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
  14. sqlite3_close(db);
  15. exit(1);
  16. }
  17. else printf("You have opened a sqlite3 database named zieckey.db successfully!/nCongratulations! Have fun !  ^-^ /n");
  18. //创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
  19. char *sql = " CREATE TABLE SensorData(    /
  20. ID INTEGER PRIMARY KEY,      /
  21. SensorID INTEGER,         /
  22. SiteNum INTEGER,        /
  23. Time VARCHAR(12),           /
  24. SensorParameter REAL     /
  25. );" ;
  26. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  27. #ifdef _DEBUG_
  28. printf("%s/n",zErrMsg);
  29. #endif
  30. //插入数据
  31. char* sql1 = "INSERT INTO /"SensorData/" VALUES( NULL , 1 , 1 , '200605011206', 18.9 );" ;
  32. sqlite3_exec( db , sql1 , 0 , 0 , &zErrMsg );
  33. char* sql2 = "INSERT INTO /"SensorData/" VALUES( NULL , 1 , 1 , '200605011306', 16.4 );" ;
  34. sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );
  35. sqlite3_close(db); //关闭数据库
  36. return 0;
  37. }

编译运行:
[root@localhost liuxltest]# gcc -o insert insert.c -lsqlite3
[root@localhost liuxltest]# ./insert 
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun !  ^-^ 
(null)
(null)
(null)
[root@localhost liuxltest]# 
查看是否插入数据:
[root@localhost liuxltest]# /usr/local/bin/sqlite3 zieckey.db "select * from SensorData"

3. 查询: SELETE
     C语言中查询数据库中的数据。
     函数接口sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
     解释:
     int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );
   result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
   nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0
程序三:query.c:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "sqlite3.h"
  4. #define _DEBUG_
  5. int main( void )
  6. {
  7. sqlite3 *db=NULL;
  8. char *zErrMsg = 0;
  9. int rc;
  10. rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
  11. if( rc )
  12. {
  13. fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
  14. sqlite3_close(db);
  15. exit(1);
  16. }
  17. else printf("You have opened a sqlite3 database named zieckey.db successfully!/nCongratulations! Have fun !  ^-^ /n");
  18. //创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
  19. char *sql = " CREATE TABLE SensorData(  /
  20. ID INTEGER PRIMARY KEY,  /
  21. SensorID INTEGER,       /
  22. SiteNum INTEGER,             /
  23. Time VARCHAR(12),      /
  24. SensorParameter REAL          /
  25. );" ;
  26. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  27. #ifdef _DEBUG_
  28. printf("zErrMsg = %s /n", zErrMsg);
  29. #endif
  30. //插入数据
  31. sql = "INSERT INTO /"SensorData/" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
  32. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  33. sql = "INSERT INTO /"SensorData/" VALUES(NULL , 1 , 1 , '200605011306', 16.4 );" ;
  34. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  35. int nrow = 0, ncolumn = 0;
  36. char **azResult; //二维数组存放结果
  37. //查询数据
  38. /*
  39. int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );
  40. result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
  41. nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0
  42. */
  43. sql = "SELECT * FROM SensorData ";
  44. sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
  45. int i = 0 ;
  46. printf( "row:%d column=%d /n" , nrow , ncolumn );
  47. printf( "/nThe result of querying is : /n" );
  48. for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
  49. printf( "azResult[%d] = %s/n", i , azResult[i] );
  50. //释放掉  azResult 的内存空间
  51. sqlite3_free_table( azResult );
  52. #ifdef _DEBUG_
  53. printf("zErrMsg = %s /n", zErrMsg);
  54. #endif
  55. sqlite3_close(db); //关闭数据库
  56. return 0;
  57. }

这里用到了一个查询的语句是 "SELECT * FROM SensorData " ,
编译运行:
[root@localhost liuxltest]# gcc -o query query.c -lsqlite3 
[root@localhost liuxltest]# ./query 
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun !  ^-^ 
zErrMsg = (null) 
row:2 column=5

The result of querying is : 
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 200605011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 1
azResult[12] = 1
azResult[13] = 200605011306
azResult[14] = 16.4
zErrMsg = (null) 
[root@localhost liuxltest]# 
      这里我们可以看到,azResult 的前面 5 个数据正好是我们的表 SensorData 的列属性,之后才是我们要查询的数据。所以我们的程序中才有 i<( nrow + 1 ) * ncolumn  的判断条件:
  for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
  printf( "azResult[%d] = %s/n", i , azResult[i] );

输出中有 zErrMsg = (null) 这样的字句,这是 zErrMsg 保留的错误信息,正如你所看到的,zErrMsg 为空,表明在执行过程中没有错误信息。

4. 删除:delete
   C语言中删除数据库中的特定的数据。
   程序四: delete.c:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "sqlite3.h"
  4. #define _DEBUG_
  5. int main( void )
  6. {
  7. sqlite3 *db=NULL;
  8. char *zErrMsg = 0;
  9. int rc;
  10. rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
  11. if( rc )
  12. {
  13. fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
  14. sqlite3_close(db);
  15. exit(1);
  16. }
  17. else printf("You have opened a sqlite3 database named zieckey.db successfully!/nCongratulations! Have fun !  ^-^ /n");
  18. //创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
  19. char *sql = " CREATE TABLE SensorData(   /
  20. ID INTEGER PRIMARY KEY,         /
  21. SensorID INTEGER,             /
  22. SiteNum INTEGER,            /
  23. Time VARCHAR(12),            /
  24. SensorParameter REAL         /
  25. );" ;
  26. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  27. #ifdef _DEBUG_
  28. printf("zErrMsg = %s /n", zErrMsg);
  29. #endif
  30. //插入数据
  31. sql = "INSERT INTO /"SensorData/" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
  32. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  33. sql = "INSERT INTO /"SensorData/" VALUES(NULL , 23 , 45 , '200605011306', 16.4 );" ;
  34. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  35. sql = "INSERT INTO /"SensorData/" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;
  36. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  37. int nrow = 0, ncolumn = 0;
  38. char **azResult; //二维数组存放结果
  39. //查询数据
  40. sql = "SELECT * FROM SensorData ";
  41. sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
  42. int i = 0 ;
  43. printf( "row:%d column=%d /n" , nrow , ncolumn );
  44. printf( "/nThe result of querying is : /n" );
  45. for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
  46. printf( "azResult[%d] = %s/n", i , azResult[i] );
  47. //删除数据
  48. sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;
  49. sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
  50. #ifdef _DEBUG_
  51. printf("zErrMsg = %s /n", zErrMsg);
  52. #endif
  53. sql = "SELECT * FROM SensorData ";
  54. sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
  55. printf( "/n/n/n/nrow:%d column=%d " , nrow , ncolumn );
  56. printf( "/nAfter deleting , the result of querying is : /n" );
  57. for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
  58. printf( "azResult[%d] = %s/n", i , azResult[i] );
  59. //释放掉  azResult 的内存空间
  60. sqlite3_free_table( azResult );
  61. #ifdef _DEBUG_
  62. printf("zErrMsg = %s /n", zErrMsg);
  63. #endif
  64. sqlite3_close(db); //关闭数据库
  65. return 0;
  66. }

linux c编程操作数据库(sqlite3应用)的更多相关文章

  1. SpringBoot使用WebFlux响应式编程操作数据库

    这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库. 前言 在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring ...

  2. Linux下用到数据库sqlite3

    最近在Linux下用到数据库sqlite3,于是开始了该方面的学习. 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库.创建 ...

  3. 如何在Linux下用C/C++语言操作数据库sqlite3(很不错!设计编译链接等很多问题!)

    from : http://blog.chinaunix.NET/uid-21556133-id-118208.html 安装Sqlite3: 从www.sqlite.org上下载Sqlite3.2. ...

  4. linux 环境 Xshell操作数据库

    一:采用sqlplus连接登录(确保安装了sqlplus) 1:先登陆进入到oracle的数据库的服务器环境下 2:切换到sqlplus操作:  sqlplus /nolog 3:conn /as s ...

  5. 手机缺失sqlite3时操作数据库的多种解决方案 ----adb命令科普

    在Android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 下面我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方案 ...

  6. adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式

    在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 以下我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方式 ...

  7. Android开发之使用sqlite3工具操作数据库的两种方式

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

  8. linux系统上Mysql数据库导入导出操作

    需求:把MySQL数据库目录中的dz数据库备份到/home/dz_bak.sql ,然后再新建一个数据库dzbak,最后把/home/dz_bak.sql 导入到数据库dzbak中.操作如下:以下操作 ...

  9. Linux下安装MySQL数据库以及用C语言编程存取数据库

    ubuntu下安装软件相当简单,一条简单的 apt-get install 就可以解决,相比源码安装方式唯一的缺点就是,你无法自定义软件的安装目录.不过这也不是什么太大的缺点.下面我们就用 apt-g ...

随机推荐

  1. 【DeepLearning】Exercise:PCA in 2D

    Exercise:PCA in 2D 习题的链接:Exercise:PCA in 2D pca_2d.m close all %%=================================== ...

  2. 要成为linux网站运维工程师必须要掌握的技能

    要成为linux网站运维工程师必须要掌握的技能 2015-07-27 发表 老男孩点评:感谢此文的作者,写的非常到位,值得入门的初学者认真看看 我是一名linux运维工程师,确切的说是网站运维工程师, ...

  3. Ubuntu菜鸟入门(十四)—— 设置root密码

    sudo su - 输入你的账户的密码 passwd 输入新的root密码 再次输入新的root密码

  4. ceph iscsi (SCST)

    ceph结合iscsi iscsi Target 安装 1.安装SCST tar -jxf scst-3.0.1.tar.bz2 cd scst-3.0.1 make && make ...

  5. 【C语言】练习1-20

    题目来源:<The C programming language>中的习题 练习1-20:编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止的地方. 思 ...

  6. 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包

    浅谈 .NET 中的对象引用.非托管指针和托管指针   目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...

  7. Set up development environment for apps for SharePoint 2013

    SharePoint 2013 support app development pattern.An app for SharePoint is small and isolate applicati ...

  8. apache apr的编译和引用

    各种巧合吧,需要从JAVA转C,经过这一段时间的心理折磨,还是决定先把精力放到C上. 想快速的提高自己,学习相关语言的经典的源码是唯一的“捷径”,从Apache apr开始吧. 一.下载源代码 官网地 ...

  9. C++ error: passing 'const std::map<>]' discards qualifiers或pass-by-reference-to-const-map导致的“discards qualifiers”

    产生问题的场景: int func(const map<int, string> &aMap) { string value = amap[0]; } 或者 int  Test:: ...

  10. [转]学习笔记_springmvc注解形式的开发参数接收

    springmvc基于注解的开发 注解第一个例子 1. 创建web项目 2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- sprimgmvc 注解驱动 --> &l ...