日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux c 数据库编程,linux c 编程操作数据库(sqlite3应用)

發布時間:2025/3/15 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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应用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。