在C语言中得到sqlite数据库中表的内容


作者: zieckey ( zieckey@yahoo.com.cn )
All Rights Reserved

现在我们来写个C/C++程序,调用 sqlite 的 API 接口函数查询e数据库中表的内容。
下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C++ 接口. 这个函数调用sqlite3_open() 在 22 行打开数据库,sqlite3_get_table 在 40 行执行 SQL 命令,并且sqlite3_close() 在 47 行关闭数据库连接。
代码:

// name: query_test_1.c
// This file is used to test C/C++ API for sqlite
// Author : zieckey
// 2006/06/28

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

int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int nrow = 0,ncolumn = 0;
char **azResult; //二维数组存放结果
int rc;
rc = sqlite3_open("zieckey.db",&db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
if( rc ){
fprintf(stderr,"Can't open database: %s/n",sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else printf("open zieckey.db successfully!/n");

//也可以参考 sprintf 的用法
//char *sql = "SELECT SensorParameter FROM SensorData WHERE SensorID = 1";
char *sql = "SELECT * FROM SensorData ";

/*
int sqlite3_get_table(sqlite3*,const char *sql,char***resultp,int *nrow,int *ncolumn,char **errmsg);
result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。nrow,ncolumn分别为 查询语句返回的结果集的行数,列数,没有查到返回0
*/
sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&zErrMsg);

int i=0;
for(i=0;i<100;i++)
printf("%s/n",azResult[i]);

printf("row:%d column=%d /n",nrow,ncolumn);
printf("zErrMsg = %s /n",zErrMsg);

sqlite3_close(db); //关闭数据库
return 0;
}



编译:# gcc query_test_1.c -o db.out
也许会碰到类似这样的问题:
query_test_1.c:2:21: sqlite3.h: No such file or directory
query_test_1.c: In function `main':
query_test_1.c:6: error: `sqlite3' undeclared (first use in this function)
query_test_1.c:6: error: (Each undeclared identifier is reported only once
query_test_1.c:6: error: for each function it appears in.)
query_test_1.c:6: error: `db' undeclared (first use in this function)


这是个没有找到库文件的问题。
由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:

# gcc query_test_1.c -o db.out -lsqlite3

我用用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,
去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )。
如果我们在编译安装的时候,选择了安装路径,例如这样的话:
.......
# ../sqlite/configure --prefix=/usr/local/arm-linux/sqlite-ix86-linux
.......
这样编译安装时,sqlite的库文件将会生成在 /usr/local/arm-linux/sqlite-ix86-linux/lib 目录下
这时编译还要指定库文件路径,因为系统默认的路径没有包含 /usr/local/arm-linux/sqlite-ix86-linux/lib

# gcc query_test_1.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib

如果还不行的话,可能还需要指定头文件 sqlite3.h 的路径,如下:

# gcc query_test_1.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib -I/usr/local/arm-linux/sqlite-ix86-linux/include

这样编译应该就可以了 ,运行:
# ./db.out
./db.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory 运行是也许会出现类似上面的错误。 这个问题是由于运行沿着系统默认路径没有找到库文件引起的。这时需要指定 libsqlite3.so.0 库文件的路径。 在shell下输入: export LD_LIBRARY_PATH=/usr/local/arm-linux/sqlite-ix86-linux/lib:$LD_LIBRARY_PATH 再运行 # ./db.out open colliery.db successfully! ID SensorID SiteNum Time SensorParameter 1 1 1 200605011206 18.9 2 1 1 200605011306 16.4 3 1 1 200605011406 15.3 4 1 1 200605011506 15.5 5 1 1 200605011606 15.8 6 1 1 200605011706 12.5 7 1 1 200605011806 5.8 8 8 5 200605011206 7 9 8 5 200605011306 6 10 8 5 200605011406 5 11 8 5 200605011506 6 12 8 5 200605011606 5 13 8 5 200605011706 6 14 8 5 200605011806 7 17 5 4 200605010606 21.6 18 5 4 200605010706 21.5 19 5 4 200605010806 21.2 20 5 4 200605010906 21.3 21 5 4 200605011006 21.6 row:51 column=5 zErrMsg = (null) 在shell命令行下用同样的命令,可以看到一下内容。这里可以比较一下,不难得到一些有价值的信息。 sqlite> SELECT * FROM SensorData ; 1|1|1|200605011206|18.9 2|1|1|200605011306|16.4 3|1|1|200605011406|15.3 4|1|1|200605011506|15.5 5|1|1|200605011606|15.8 6|1|1|200605011706|12.5 7|1|1|200605011806|5.8 8|8|5|200605011206|7 9|8|5|200605011306|6 10|8|5|200605011406|5 11|8|5|200605011506|6 12|8|5|200605011606|5 13|8|5|200605011706|6 14|8|5|200605011806|7 17|5|4|200605010606|21.6 18|5|4|200605010706|21.5 19|5|4|200605010806|21.2 20|5|4|200605010906|21.3 21|5|4|200605011006|21.6 22|5|4|200605011106|21.5 23|5|4|200605011206|21.2 27|3|2|200603020720|0.28 28|3|2|200603020820|0.65 29|3|2|200603020920|0.32 30|3|2|200603021020|0.28 31|3|2|200603021120|0.65 32|3|2|200603021220|0.32 33|3|2|200603021320|0.23 54|2|1|200605011206|18.9 55|2|1|200605011306|16.4 56|2|1|200605011406|15.3 57|2|1|200605011506|15.5 58|2|1|200605011606|15.8 59|2|1|200605011706|12.5 60|2|1|200605011806|13.6 61|2|1|200605011906|15.5 62|4|3|200605011206|0.3 63|4|3|200605011206|0.4 64|4|3|200605011206|0.2 65|4|3|200605011206|0.2 66|4|3|200605011206|0.3 67|4|3|200605011206|0.3 68|4|3|200605011206|0.2 69|4|3|200605011206|0.4 95|6|6|200603022320|14.23 96|6|6|200603022420|16.23 97|6|6|200603022020|23.23 98|6|6|200603022120|21.23 99|6|6|200603022220|23.23 100|6|6|200603022320|22.23 101|6|6|200603022420|22.23 另外这里用到zieckey.db数据库内容: BEGIN TRANSACTION; CREATE TABLE SensorData( ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL ); INSERT INTO "SensorData" VALUES(1,1,'200605011206',18.9); INSERT INTO "SensorData" VALUES(2,'200605011306',16.4); INSERT INTO "SensorData" VALUES(3,'200605011406',15.3); INSERT INTO "SensorData" VALUES(4,'200605011506',15.5); INSERT INTO "SensorData" VALUES(5,'200605011606',15.8); INSERT INTO "SensorData" VALUES(6,'200605011706',12.5); INSERT INTO "SensorData" VALUES(7,'200605011806',5.8); INSERT INTO "SensorData" VALUES(8,8,5,7); INSERT INTO "SensorData" VALUES(9,6); INSERT INTO "SensorData" VALUES(10,5); INSERT INTO "SensorData" VALUES(11,6); INSERT INTO "SensorData" VALUES(12,5); INSERT INTO "SensorData" VALUES(13,6); INSERT INTO "SensorData" VALUES(14,7); INSERT INTO "SensorData" VALUES(17,4,'200605010606',21.6); INSERT INTO "SensorData" VALUES(18,'200605010706',21.5); INSERT INTO "SensorData" VALUES(19,'200605010806',21.2); INSERT INTO "SensorData" VALUES(20,'200605010906',21.3); INSERT INTO "SensorData" VALUES(21,'200605011006',21.6); INSERT INTO "SensorData" VALUES(22,'200605011106',21.5); INSERT INTO "SensorData" VALUES(23,21.2); INSERT INTO "SensorData" VALUES(27,3,2,'200603020720',0.28); INSERT INTO "SensorData" VALUES(28,'200603020820',0.65); INSERT INTO "SensorData" VALUES(29,'200603020920',0.32); INSERT INTO "SensorData" VALUES(30,'200603021020',0.28); INSERT INTO "SensorData" VALUES(31,'200603021120',0.65); INSERT INTO "SensorData" VALUES(32,'200603021220',0.32); INSERT INTO "SensorData" VALUES(33,'200603021320',0.23); INSERT INTO "SensorData" VALUES(54,18.9); INSERT INTO "SensorData" VALUES(55,16.4); INSERT INTO "SensorData" VALUES(56,15.3); INSERT INTO "SensorData" VALUES(57,15.5); INSERT INTO "SensorData" VALUES(58,15.8); INSERT INTO "SensorData" VALUES(59,12.5); INSERT INTO "SensorData" VALUES(60,13.6); INSERT INTO "SensorData" VALUES(61,'200605011906',15.5); INSERT INTO "SensorData" VALUES(62,0.3); INSERT INTO "SensorData" VALUES(63,0.4); INSERT INTO "SensorData" VALUES(64,0.2); INSERT INTO "SensorData" VALUES(65,0.2); INSERT INTO "SensorData" VALUES(66,0.3); INSERT INTO "SensorData" VALUES(67,0.3); INSERT INTO "SensorData" VALUES(68,0.2); INSERT INTO "SensorData" VALUES(69,0.4); INSERT INTO "SensorData" VALUES(95,6,'200603022320',14.23); INSERT INTO "SensorData" VALUES(96,'200603022420',16.23); INSERT INTO "SensorData" VALUES(97,'200603022020',23.23); INSERT INTO "SensorData" VALUES(98,'200603022120',21.23); INSERT INTO "SensorData" VALUES(99,'200603022220',23.23); INSERT INTO "SensorData" VALUES(100,22.23); INSERT INTO "SensorData" VALUES(101,22.23); COMMIT; 另外感谢武汉大学 zHaocHen 朋友所给的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="