1、sql3学习 linuxc编程操作数据库(sqlite3应用)(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 的
2、目录是: /usr/local/include用ls命令查看如下:rootlocalhost config# ls /usr/local/liblibclamav.a libclamunrar_iface.a libclamunrar.so libsqlite3.solibclamav.la libclamunrar_iface.la libclamunrar.so.5 libsqlite3.so.0libclamav.so libclamunrar_iface.so libclamunrar.so.5.0.3 libsqlite3.so.0.8.6libclamav.so.5 libclam
3、unrar_iface.so.5 libmstring.so pkgconfiglibclamav.so.5.0.3 libclamunrar_iface.so.5.0.3 libsqlite3.alibclamunrar.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+ 接口. 数据库的名字由第
4、一个参数取得且第个参数或更多的参数是 SQL 执行语句. 这个函数调用sqlite3_open() 打开数据库,并且调用sqlite3_close() 关闭数据库连接。 程序一:opendbslite.c:view plaincopy to clipboardprint?#include #include #include int main( void )sqlite3 *db=NULL;char *zErrMsg = 0;int rc;/打开指定的数据库文件,如果不存在将创建一个同名的数据库文件rc = sqlite3_open(zieckey.db, &db);if( rc ) fprin
5、tf(stderr, Cant open database: %sn, sqlite3_errmsg(db); sqlite3_close(db); exit(1);else printf(You have opened a sqlite3 database named zieckey.db successfully!nCongratulations! Have fun ! - n);sqlite3_close(db); /关闭数据库return 0;#include #include #include int main( void )sqlite3 *db=NULL;char *zErrMs
6、g = 0;int rc;/打开指定的数据库文件,如果不存在将创建一个同名的数据库文件rc = sqlite3_open(zieckey.db, &db);if( rc ) fprintf(stderr, Cant open database: %sn, sqlite3_errmsg(db); sqlite3_close(db); exit(1);else printf(You have opened a sqlite3 database named zieckey.db successfully!nCongratulations! Have fun ! - n);sqlite3_close(
7、db); /关闭数据库return 0;编译(问题):rootlocalhost liuxltest# gcc -o opendbsqlite opendbsqlite.c/tmp/ccuquUQN.o: In function main:opendbsqlite.c:(.text+0x2e): undefined reference to sqlite3_openopendbsqlite.c:(.text+0x42): undefined reference to sqlite3_errmsgopendbsqlite.c:(.text+0x67): undefined reference t
8、o sqlite3_closeopendbsqlite.c:(.text+0x8a): undefined reference to sqlite3_closecollect2: ld returned 1 exit status编译(解决):出现上述问题是因为没有找到库文件的问题。由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:rootlocalhost liuxltest# gcc -o opendbsqlite opendbsqlite.c -lsqlite3用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,去
9、掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )执行:rootlocalhost liuxltest# ./opendbsqliteYou have opened a sqlite3 database named zieckey.db successfully!Congratulations! Have fun ! -rootlocalhost liuxltest# 2. 插入 :insert 在C语言中向数据库插入数据:sqlite3_exec的函数原型说明如下:int sqlite3_exec( sqlite3*, const char *sql,
10、sqlite_callback, void *, char *errmsg);程序二:insert.c:view plaincopy to clipboardprint?#include #include #include sqlite3.h#define _DEBUG_int main( void )sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open(zieckey.db, &db); /打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ) fprintf(stderr, Cant open datab
11、ase: %sn, sqlite3_errmsg(db); sqlite3_close(db); exit(1);else printf(You have opened a sqlite3 database named zieckey.db successfully!nCongratulations! Have fun ! - n);/创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql = CREATE TABLE SensorData( ID INTEGER PRIMARY KEY, SensorID INTEGER, SiteNum INTEG
12、ER, Time VARCHAR(12), SensorParameter REAL ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_ printf(%sn,zErrMsg);#endif/插入数据char* sql1 = INSERT INTO SensorData VALUES( NULL , 1 , 1 , 200605011206, 18.9 ); ;sqlite3_exec( db , sql1 , 0 , 0 , &zErrMsg );char* sql2 = INSERT INTO SensorData
13、VALUES( NULL , 1 , 1 , 200605011306, 16.4 ); ;sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );sqlite3_close(db); /关闭数据库return 0;#include #include #include sqlite3.h#define _DEBUG_int main( void )sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open(zieckey.db, &db); /打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
14、if( rc ) fprintf(stderr, Cant open database: %sn, sqlite3_errmsg(db); sqlite3_close(db); exit(1);else printf(You have opened a sqlite3 database named zieckey.db successfully!nCongratulations! Have fun ! - n);/创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql = CREATE TABLE SensorData( ID INTEGER PRIM
15、ARY KEY, SensorID INTEGER, SiteNum INTEGER, Time VARCHAR(12), SensorParameter REAL ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_ printf(%sn,zErrMsg);#endif/插入数据char* sql1 = INSERT INTO SensorData VALUES( NULL , 1 , 1 , 200605011206, 18.9 ); ;sqlite3_exec( db , sql1 , 0 , 0 , &zErrMs
16、g );char* sql2 = INSERT INTO SensorData VALUES( NULL , 1 , 1 , 200605011306, 16.4 ); ;sqlite3_exec( db , sql2 , 0 , 0 , &zErrMsg );sqlite3_close(db); /关闭数据库return 0;编译运行:rootlocalhost liuxltest# gcc -o insert insert.c -lsqlite3rootlocalhost liuxltest# ./insertYou have opened a sqlite3 database named
17、 zieckey.db successfully!Congratulations! Have fun ! -(null)(null)(null)rootlocalhost liuxltest#查看是否插入数据:rootlocalhost liuxltest# /usr/local/bin/sqlite3 zieckey.db select * from SensorData 3. 查询: SELETE C语言中查询数据库中的数据。 函数接口sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); 解释: i
18、nt sqlite3_get_table(sqlite3*, const char *sql,char*result , int *nrow , int *ncolumn ,char *errmsg ); result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。 nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0程序三:query.c:view plaincopy to clipboardprint?#include #include #include sqlite3.h#define _DEBUG_int main( void )sqlite
19、3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open(zieckey.db, &db); /打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ) fprintf(stderr, Cant open database: %sn, sqlite3_errmsg(db); sqlite3_close(db); exit(1);else printf(You have opened a sqlite3 database named zieckey.db successfully!nCongratulations! Have f
20、un ! - n);/创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql = CREATE TABLE SensorData( ID INTEGER PRIMARY KEY, SensorID INTEGER, SiteNum INTEGER, Time VARCHAR(12), SensorParameter REAL ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_ printf(zErrMsg = %s n, zErrMsg);#endif/插入数据sql = INS
21、ERT INTO SensorData VALUES(NULL , 1 , 1 , 200605011206, 18.9 ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = INSERT INTO SensorData VALUES(NULL , 1 , 1 , 200605011306, 16.4 ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0;char *azResult; /二维数组存放结果/查询数据sql = SELECT * FR
22、OM SensorData ;sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( row:%d column=%d n , nrow , ncolumn );printf( nThe result of querying is : n );for( i=0 ; i( nrow + 1 ) * ncolumn ; i+ ) printf( azResult%d = %sn, i , azResulti );/释放掉 azResult 的内存空间sqlite3_free
23、_table( azResult );#ifdef _DEBUG_ printf(zErrMsg = %s n, zErrMsg);#endifsqlite3_close(db); /关闭数据库return 0;#include #include #include sqlite3.h#define _DEBUG_int main( void )sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open(zieckey.db, &db); /打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ) fprintf(st
24、derr, Cant open database: %sn, sqlite3_errmsg(db); sqlite3_close(db); exit(1);else printf(You have opened a sqlite3 database named zieckey.db successfully!nCongratulations! Have fun ! - n);/创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql = CREATE TABLE SensorData( ID INTEGER PRIMARY KEY, SensorID I
25、NTEGER, SiteNum INTEGER, Time VARCHAR(12), SensorParameter REAL ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_ printf(zErrMsg = %s n, zErrMsg);#endif/插入数据sql = INSERT INTO SensorData VALUES(NULL , 1 , 1 , 200605011206, 18.9 ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = INSERT
26、 INTO SensorData VALUES(NULL , 1 , 1 , 200605011306, 16.4 ); ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0;char *azResult; /二维数组存放结果/查询数据sql = SELECT * FROM SensorData ;sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( row:%d column=%d n , nrow , ncolumn );printf( nThe result of querying is : n );for( i=0 ; i( nrow + 1 ) * ncolumn ; i+ ) printf( azResult%d = %sn, i , azResulti
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1