linux c 数据库编程,linux c 编程操作数据库(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 的目錄是: /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:
#include?
#include?
#include?
int?main(?void?)
{
sqlite3?*db =
NULL;
char?*zErrMsg?=?0;
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?("You?have?opened?a?sqlite3?database?named?zieckey.db?successfully!/nCongratulations!?Have?fun?!?^-^?/n");
sqlite3_close(db);?//關閉數據庫
return?0;
}
[root@localhost liuxltest]# gcc -o opendbsqlite
opendbsqlite.c -lsqlite3用
-lsqlite3 選項就可以了(前面我們生成的庫文件是 libsqlite3.so.0.8.6 等,去掉前面的lib和后面的版本標志,就剩下 sqlite3 了,所以是 -lsqlite3
)
--------------------------------------------------------------------------------------------------
2.
插入:insert?在C語言中向數據庫插入數據:
sqlite3_exec的函數原型說明如下:
int sqlite3_exec
(
sqlite3*,?const
char
*sql,?sqlite_callback,?void
*,?char
**errmsg?);?程序二:insert.c:
#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,?"Can't?open?database:?%s/n",?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?INTEGER,?\
Time?VARCHAR(12),?\
SensorParameter?REAL?\
);"?;
sqlite3_exec(?db?,?sql?,?0?,?0?,?&zErrMsg?);
#ifdef?_DEBUG_
printf("%s/n",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/"?VALUES(?NULL?,?1?,?1?,?'200605011306',?16.4?);"?;
sqlite3_exec(?db?,?sql2?,?0?,?0?,?&zErrMsg?);
sqlite3_close(db);?//關閉數據庫
return?0;
}
編譯運行。
查看是否插入數據:
[root@localhost liuxltest]# /usr/local/bin/sqlite3 zieckey.db "select * from
SensorData"
--------------------------------------------------------------------------------------------------
3. 查詢:
SELETE?C語言中查詢數據庫中的數據。
函數接口sqlite3_get_table( db , sql ,
&azResult , &nrow ,
&ncolumn , &zErrMsg );
sqlite3_get_table函數原型說明如下:
int sqlite3_get_table
(
sqlite3*,
const
char *sql,
char***result,
int
*nrow,
int
*ncolumn,
char
**errmsg
);
result中是以數組的形式存放你所查詢的數據,首先是表的列屬性,再是數據。
nrow
,ncolumn分別為查詢語句返回的結果集的行數(不包括列屬性名一行),列數,沒有查到結果時返回0?程序三:query.c:
#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,?"Can't?open?database:?%s/n",?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?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?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
printf(?"azResult[%d]?=?%s/n",?i?,?azResult[i]?);
//釋放掉?azResult?的內存空間
sqlite3_free_table(?azResult?);
#ifdef?_DEBUG_
printf("zErrMsg?=?%s?/n",?zErrMsg);
#endif
sqlite3_close(db);?//關閉數據庫
return?0;
}
這里用到了一個查詢的語句是 "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
(row不包括列屬性一行)
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameterazResult[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
ncolumn?的判斷條件:
for( i=0 ;
i
printf( "azResult[%d] = %s/n", i , azResult[i] );
輸出中有 zErrMsg = (null) 這樣的字句,這是 zErrMsg
保留的錯誤信息,正如你所看到的,zErrMsg 為空,表明在執行過程中沒有錯誤信息。
--------------------------------------------------------------------------------------------------?4.
刪除:delete?C語言中刪除數據庫中的特定的數據。
程序四: delete.c:
#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,?"Can't?open?database:?%s/n",?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?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?INTO?/"SensorData/"?VALUES(NULL?,?23?,?45?,?'200605011306',?16.4?);"?;
sqlite3_exec(?db?,?sql?,?0?,?0?,?&zErrMsg?);
sql?=?"INSERT?INTO?/"SensorData/"?VALUES(NULL?,?34?,?45?,?'200605011306',?15.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
printf(?"azResult[%d]?=?%s/n",?i?,?azResult[i]?);
(問:此處不需要sqlite3_free_table(?azResult?);嗎?)
//刪除數據
sql?=?"DELETE?FROM?SensorData?WHERE?SensorID?=?1?;"?;
sqlite3_exec(?db?,?sql?,?0?,?0?,?&zErrMsg?);
#ifdef?_DEBUG_
printf("zErrMsg?=?%s?/n",?zErrMsg);
#endif
sql?=?"SELECT?*?FROM?SensorData?";
sqlite3_get_table(?db?,?sql?,?&azResult?,?&nrow?,?&ncolumn?,?&zErrMsg?);
printf(?"/n/n/n/nrow:%d?column=%d?"?,?nrow?,?ncolumn?);
printf(?"/nAfter?deleting?,?the?result?of?querying?is?:?/n"?);
for(?i=0?;?i
printf(?"azResult[%d]?=?%s/n",?i?,?azResult[i]?);
//釋放掉?azResult?的內存空間
sqlite3_free_table(?azResult?);
#ifdef?_DEBUG_
printf("zErrMsg?=?%s?/n",?zErrMsg);
#endif
sqlite3_close(db);?//關閉數據庫
return?0;
}
編譯運行。?從程序輸出結果就可以看出,在刪除數據前,我們有三條記錄,刪除數據后我們發現,數據庫內記錄少了1條。從而實現了我們的刪除數據目的。
總結
以上是生活随笔為你收集整理的linux c 数据库编程,linux c 编程操作数据库(sqlite3应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: linux 管道交互,Linux C:具
- 下一篇: python中if控制语句_Python
