C++操作SQLiteサンプルノート
4710 ワード
SQLLiteは軽量レベルのリレーショナル・データベースであり、設計の目標は組み込み型であり、多くのデスクトップアプリケーション(例えば、火狐ブラウザ、QQ、skype)及び携帯電話アプリケーションはよくそれをデータとして記憶しているが、結局、純テキスト或いはxml形式の読み取りは不便である.C言語はSQLite 3を操作する方式が簡単で、以下のプログラムは大体データテーブルの作成、データの挿入、データの検索のいくつかのよく使われるデータ操作を実証した.
もちろんsqlite 3を参照する必要があります.dll,sqlite3.libは自分でソースコードのコンパイルをダウンロードしたり、sqlite 3を使用したりすることができます.defファイルのコンパイル時にlibファイルを生成することを指定します.次は私がカプセル化した操作クラスです
sqliteproxy.hヘッダファイル内容
#include<iostream>
extern "C"
{
#include"sqlite3.h"
}
using namespace std;
//callback function
int select_cb_function(void *data,int n_cols,char **colvals,char **colnames)
{
int i;
static bool title_shown = false;
if(title_shown == false)
{
//print col name
for(i = 0;i < n_cols;i ++)
{
cout << colnames[i] << "\t";
}
cout << endl;
title_shown = true;
}
//print select results
for(i = 0;i < n_cols;i ++)
{
cout << colvals[i] << "\t";
}
cout << endl;
return 0;
}
int main()
{
sqlite3 *sdb = NULL;
char *err = NULL;
//open a database
int rc = sqlite3_open("temp.db",&sdb);
if(!rc){
//create a table
rc = sqlite3_exec(sdb,"create table user(name varchar(20),age int)",0,0,&err);
if(rc != SQLITE_OK){
cout << "error occured " << err << endl;
sqlite3_close(sdb);
exit(-1);
}
//insert a record
for(int i = 0; i < 2;i ++){
rc = sqlite3_exec(sdb,"insert into user values(\"ciaos\",25)",0,0,&err);
if(rc != SQLITE_OK){
cout << "error occured " << err << endl;
sqlite3_close(sdb);
exit(-1);
}
}
//select records
rc = sqlite3_exec(sdb,"select * from user",select_cb_function,0,&err);
if(rc != SQLITE_OK){
cout << "error occured " << err << endl;
sqlite3_close(sdb);
exit(-1);
}
sqlite3_close(sdb);
}
return 0;
}
もちろんsqlite 3を参照する必要があります.dll,sqlite3.libは自分でソースコードのコンパイルをダウンロードしたり、sqlite 3を使用したりすることができます.defファイルのコンパイル時にlibファイルを生成することを指定します.次は私がカプセル化した操作クラスです
sqliteproxy.hヘッダファイル内容
#ifndef __SQLITEPROXY_H
#define __SQLITEPROXY_H
#include<map>
extern "C"
{
#include"sqlite3.h"
}
using std::map;
typedef struct _DBConn
{
sqlite3 *dbc;
}DBConn;
typedef struct _DBResult
{
bool status;
char **result;
int nRow;
int nColumn;
}DBResult;
class SQLiteProxy{
private:
std::map<char *,DBConn>pxs;
DBConn OpenSQLite(char *dbname){
map<char *,DBConn>::iterator it = pxs.find(dbname);
if(it == pxs.end()){
DBConn dbp;
dbp.dbc = NULL;
int res = sqlite3_open(dbname,&dbp.dbc);
if(res != SQLITE_OK){
exit(-1);
}
pxs.insert(map<char *,DBConn>::value_type(dbname,dbp));
return dbp;
}
else
{
return it->second;
}
}
public:
SQLiteProxy(){
}
~SQLiteProxy(){
int status;
for(map<char *,DBConn>::iterator it = pxs.begin(), ite = pxs.end();it != ite;it ++){
status = sqlite3_close(it->second.dbc);
if(status != SQLITE_OK){
exit(-1);
}
}
pxs.clear();
}
//create|insert|update|delete ...
bool Exec(char *dbname,char *sql){
int res;
char *err = NULL;
DBConn db = OpenSQLite(dbname);
res = sqlite3_exec(db.dbc,sql,0,0,&err);
if(res != SQLITE_OK){
return false;
}
return true;
}
//select
DBResult Query(char *dbname,char *sql){
int res;
char *err = NULL;
DBConn db = OpenSQLite(dbname);
DBResult dbr;
res = sqlite3_get_table(db.dbc,sql,&dbr.result,&dbr.nRow,&dbr.nColumn,&err);
if(res == SQLITE_OK)
{
dbr.status = true;
return dbr;
}
dbr.status = false;
return dbr;
}
};
#endif
selectクエリー操作はQuery関数を呼び出し、その他の操作はExec関数を呼び出し、使用例は以下の通りである.#include<iostream>
#include"sqliteproxy.h"
using namespace std;
int main()
{
//
// new
//
SQLiteProxy *sp = new SQLiteProxy();
bool res;
res = sp->Exec("1.db","create table user(name varchar(20),age int)");
cout << res << endl;
res = sp->Exec("1.db","insert into user values('ciaos',25)");
cout << res << endl;
res = sp->Exec("1.db","delete from user");
cout << res << endl;
res = sp->Exec("1.db","insert into user values('ciaos',25)");
cout << res << endl;
DBResult dbr = sp->Query("1.db","select * from user");
if(dbr.status){
int index = dbr.nColumn;
for(int i =1;i<=dbr.nRow;i++){
for(int j =0;j<dbr.nColumn;j++){
cout << dbr.result[j] << " " << dbr.result[index] << " ";
index ++;
}
cout << endl;
}
}
//
// delete
//
delete sp;
//
return 0;
}