首先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. PL/SQL报无效的窗口句柄的解决办法

    在远程服务器上使用pl sql developer查询oralce数据库的时候,遇到很长的文本变量想点开小窗口看下具体内容, 但系统弹窗提示“无效的窗口句柄”,听同事介绍原来需要开启一个windows ...

  2. Android拦截外拨电话

    拦截监听外拨的电话,并进行处理: 向外拨打电话时系统会发出一个有序广播,虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打,但我们可以在广播传递给拔号广播接收者之前先得到该广播,然后清除传递给 ...

  3. 阿里云安装jdk,tomcat,maven,svn,git,nginx

    1. 首先通过xftp等工具上传安装包 2. 配置目录 cd usr mkdir java cd java mkdir jdk mkdir tomcatmkdir maven 3. 安装jdk 3.1 ...

  4. tensorflow内存溢出问题

    Tensorflow的静态图结构简洁清晰,符合人的思维.虽然编程上略微有些复杂,但是原理很容易看懂. Tensorflow分建图过程和运行图(张量求值)两个阶段,在这两个阶段中都可以定义操作和张量.但 ...

  5. ios持久化存储

    前言 iOS中常用的持久化存储方式有好几种: 偏好设置(NSUserDefaults) plist文件存储 归档 SQLite3 Core Data 沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就 ...

  6. Linux命令-进程后台执行:nohup(就是不挂起的意思)

    nohup 就是不挂起的意思( no hang up) 用途:LINUX命令用法,不挂断地运行命令. 语法: nohup Command [ Arg ... ] [ & ] 描述:nohup ...

  7. 恢复oracle中用PLSQL误删除drop掉的表

    一.查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recy ...

  8. spring 定时任务执行两次解决办法

    在web.xml中同时配置了ContextLoaderListener和DispatcherServlet?假如真是这样的话,需要删掉一个配置,因为你相当于配置了两个spring容器,两个容器分别都执 ...

  9. 创建一个已经存在数据的MySQL复制

    1.配置master库必须开启二进制日志和分配唯一的server id·如果没设置server-id或将其设置为0,master节点会拒绝slave的连接·建议在master节点设置innodb_fl ...

  10. 水晶报表填充.Net Objects数据源

    Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表.是业内最专业.功能最强的报表系统. 查看网络资料及课本图书,鲜有介绍通过.NET Objects作为数据源 ...