C++操作SQLiteサンプルノート

4710 ワード

SQLLiteは軽量レベルのリレーショナル・データベースであり、設計の目標は組み込み型であり、多くのデスクトップアプリケーション(例えば、火狐ブラウザ、QQ、skype)及び携帯電話アプリケーションはよくそれをデータとして記憶しているが、結局、純テキスト或いはxml形式の読み取りは不便である.C言語はSQLite 3を操作する方式が簡単で、以下のプログラムは大体データテーブルの作成、データの挿入、データの検索のいくつかのよく使われるデータ操作を実証した.
#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;
}