在Linux下用C語言操作數據庫sqlite3(查詢)

查詢: SELETE

  好了,我們知道了怎麼調用 sqlite3 的C/C++的API函數接口去創建數據庫、創建表格、並插入數據,

  下面我們看看怎麼在C語言中查詢數據庫中的數據。

  好的,我們現編輯一段c代碼,取名爲 query.c

// name: query.c
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !
// Author : zieckey All rights reserved.
// data : 2006/11/18
#include <stdio.h>
#include <stdlib.h>
#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
", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}

else printf("You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
");
//創建一個表,如果該表存在,則不創建,並給出提示信息,存儲在 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
", 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
" , nrow , ncolumn );
printf( "
The result of querying is :
" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s
", i , azResult[i] );
//釋放掉 azResult 的內存空間
sqlite3_free_table( azResult );
#ifdef _DEBUG_
printf("zErrMsg = %s
", zErrMsg);
#endif
sqlite3_close(db); //關閉數據庫
return 0;
}

  我們這裏用到了一個查詢的語句是 "SELECT * FROM SensorData " ,

  在C語言中對應的函數接口是 sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );

 這個函數接口的解釋在程序中已經註釋。

  下面我們編譯運行下看看,

  [root@localhost temp]# export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH

  [root@localhost temp]# gcc query.c -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include

  query.c:29:21: warning: multi-line string literals are deprecated

  [root@localhost temp]# ./a.out

  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)

  這裏我們可以看到,azResult 的前面 5 個數據正好是我們的表 SensorData 的列屬性,

  之後纔是我們要查詢的數據。所以我們的程序中才有 i<( nrow + 1 ) * ncolumn 的判斷條件:

  for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )

  printf( "azResult[%d] = %s ", i , azResult[i] );

  輸出中有 zErrMsg = (null) 這樣的字句,這是 zErrMsg 保留的錯誤信息,

  正如你所看到的,zErrMsg 爲空,表明在執行過程中沒有錯誤信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章