C 封裝SQLite例項《二》

2021-06-13 06:26:24 字數 2916 閱讀 9765

這一篇部落格主要講如何使用sqlite有關庫函式去管理資料庫中的一張表。

主要用到的函式:

sqlite_api int sqlite3_get_table
(

sqlite3 *db, /* the database on which the sql executes */

const char *zsql, /* the sql to be executed */

char ***pazresult, /* write the result table here */

int *pnrow, /* write the number of rows in the result here */

int *pncolumn, /* write the number of columns of result here */

char **pzerrmsg /* write error messages here */

)

比較難理解的是第三個引數,是乙個三重指標。pazresult指向的是乙個一維指標陣列,char*result[num];在sqlite中所有的字段都是被解釋為字串型別儲存的,採用的是utf8編碼方式。並且將乙個二維表儲存在了一維陣列中,就是將乙個一維陣列分割成了mnrows個段,每一段代表二維表中的一行,一行有mncols個元素。只要給出確切的行值與列值,就能根據公式算出在一位陣列中的索引下標。

class cppsqlite3table

;

cppsqlite3table::cppsqlite3table()

cppsqlite3table::cppsqlite3table(const cppsqlite3table &rtable)

cppsqlite3table::cppsqlite3table(char **paszresults, int nrows, int ncols)

cppsqlite3table::~cppsqlite3table()

cppsqlite3table& cppsqlite3table::operator= (const cppsqlite3table &rtable)

void cppsqlite3table::finalize()

}int cppsqlite3table::numoffields()

int cppsqlite3table::numofrows()

const char* cppsqlite3table::nameoffield(int nfield)

return mpaszresults[nfield]; //一位陣列的頭mncols個元素存放的是表的欄位名稱,儲存具體位置是mpaszresults[0,,,mncols-1]。

}const char* cppsqlite3table::valueoffield(int nfield)

//根據要查詢的當前行與列值算出在一位陣列中的索引下標,額外加乙個mncols是第一行儲存的是欄位名

int nindex = mncurrentrow*mncols + mncols + nfield;

return mpaszresults[nindex];

}//根據欄位名稱來訪問某一列的資料

const char* cppsqlite3table::valueoffield(const char *szfield)

} }throw cppsqlite3exception(cppsqlite_error,

"invalid field name requested",

dont_delete_msg);

}bool cppsqlite3table::fieldisnull(int nfield)

bool cppsqlite3table::fieldisnull(const char* szfield)

//這裡的獲取具體型別數值函式,需要使用者對資料庫中的表有一定的了解,知道哪些字段儲存的是什麼內容

//並且使用的是外部傳遞引用的形式

bool cppsqlite3table::getintfield(int nfield, int &rdest)

else }

bool cppsqlite3table::getintfield(const char *szfield, int &rdest)

else }

bool cppsqlite3table::getfloatfield(int nfield, double &rdest)

else }

bool cppsqlite3table::getfloatfield(const char *szfield, double &rdest)

else }

bool cppsqlite3table::getstringfield(int nfield, char *&rdest)

else }

bool cppsqlite3table::getstringfield(const char *szfield, char *&rdset)

else }

//在每一次需要獲取資料的時候都要設定要訪問的行值

void cppsqlite3table::setrow(int nrow)

mncurrentrow = nrow;

}void cppsqlite3table::checkresluts()

}

與select查詢相比,獲取並維護一整張表會容易很多,對錶的訪問全轉化為對一位陣列的訪問了,只需要做乙個簡單的邏輯位址(就是下標)轉化。後面會講如何獲取乙個查詢並維護這個查詢的結果,這個結果可能只有一條記錄,也可能有很多條記錄。

C 封裝SQLite例項《六》

之前的連續五篇大致介紹了各種sqlite的原生函式原型,引數以及用途等,並對各個封裝的類做了詳細的介紹,最後一篇將展示一下怎麼使用封裝,使用封裝的時候需要注意的問題等。假設已經存在乙個資料庫名為firsqlite.db 下面使用各種類來對其做各種常規訪問與操作。最開始要定義乙個cppsqlite3d...

C語言封裝sqlite3 API

執行類似insert,update,create,drop這些不需要結果的sql語句。int executenoquery sqlite3 db,const char sql if sqlite3 step pstmt sqlite done if pstmt null sqlite3 finali...

sqlite 專案例項

private string url 單擊事件 private void button1 click object sender,eventargs e private datatable dtcatelog2 繫結資料來源 private datarow dtcatelog private dat...