SQLite 数据库接口

http://hi.baidu.com/5p2o5pio5p2w/blog/item/f33072fb80d975274e4aeac5.html

////////////////////////////////////////////////////////////////////////////////
//
// SQLite3Database.h
//
////////////////////////////////////////////////////////////////////////////////

#ifndef __SQLITE3_DATABASE_H__
#define __SQLITE3_DATABASE_H__

extern "C" {
#    include "sqlite3.h"
}

#ifndef WX_PRECOMP
#    include "wx/wx.h"
#endif

class SQLite3Reader
{
private :
    sqlite3 *m_db;
    sqlite3_stmt *m_stmt;

public :
    SQLite3Reader(sqlite3 *m_db, sqlite3_stmt *stmt);
    ~SQLite3Reader();


    int Read();


    const char *GetString(unsigned int index = 0);
    int         GetInt(unsigned int index = 0);
    long long   GetInt64(unsigned int index = 0);
    double      GetDouble(unsigned int index = 0);


    const char *GetErrorMsg();

};

class SQLite3Database
{
private :
    sqlite3 *m_db;

    enum
    {
        _SQLITE3_DB_ERROR_           = -1,
        _SQLITE3_DB_OK_              = 0,
        _SQLITE3_DB_INDEX_OVERFLOW_ = 1,
        _SQLITE3_DB_NO_ROW_RETURN_   = 2
    };


    int m_errcode;

    int Check();

#ifdef __WXMSW__
    int BindwxControlWithItems(wxControlWithItems *ctrlwithitem,
                               const char *sql, unsigned int index = 0);
#endif

public :
    SQLite3Database();
    ~SQLite3Database();

    int Open(const char *filename);

    void Close();

    int ExecuteUpdate(const char *sql);

    SQLite3Reader *ExecuteQuery(const char *sql);

    const char *GetErrorMsg();

#ifdef __WXMSW__

    int BindwxTextCtrl(wxTextCtrl *textctrl, const char *sql, unsigned int index = 0);

    int BindwxComboBox(wxComboBox *combobox, const char *sql, unsigned int index = 0);

#endif //__WXMSW__
};

#endif //__SQLITE3_DATABASE_H_


////////////////////////////////////////////////////////////////////////////////
//
// SQLite3Database.cpp
//
////////////////////////////////////////////////////////////////////////////////

#include "SQLite3Database.h"

SQLite3Reader::SQLite3Reader(sqlite3 *db, sqlite3_stmt *stmt)
{
   m_db = db;
   m_stmt = stmt;
}

SQLite3Reader::~SQLite3Reader()
{
   sqlite3_finalize(m_stmt);
}

int SQLite3Reader::Read()
{
   int rc = sqlite3_step(m_stmt);


   return (rc == SQLITE_ROW);
}

const char *SQLite3Reader::GetString(unsigned int index)
{
   return (const char *)sqlite3_column_text(m_stmt, index);
}

int SQLite3Reader::GetInt(unsigned int index)
{
   return sqlite3_column_int(m_stmt, index);
}

long long SQLite3Reader::GetInt64(unsigned int index)
{
   return sqlite3_column_int64(m_stmt, index);
}

double SQLite3Reader::GetDouble(unsigned int index)
{
   return sqlite3_column_double(m_stmt, index);
}

const char *SQLite3Reader::GetErrorMsg()
{
   return (const char *)sqlite3_errmsg(m_db);
}

SQLite3Database::SQLite3Database()
{
   m_db = NULL;
   m_errcode = _SQLITE3_DB_OK_;
}

SQLite3Database::~SQLite3Database()
{
   Close();
}

int SQLite3Database::Check()
{
   return (m_db != NULL);
}

int SQLite3Database::Open(const char *filename)
{
   int rc = sqlite3_open(filename, &m_db);


   if(rc != SQLITE_OK)
   {
       Close();
       m_errcode = _SQLITE3_DB_ERROR_;
       return FALSE;
   }


   return TRUE;      
}

void SQLite3Database::Close()
{
   if(!m_db)
   {
       sqlite3_close(m_db);
       m_db = NULL;
   }
}

int SQLite3Database::ExecuteUpdate(const char *sql)
{
   int rc = sqlite3_exec(m_db, sql, NULL, 0, NULL);


   if(rc != SQLITE_OK)
   {
       m_errcode = _SQLITE3_DB_ERROR_;
       return FALSE;
   }


   return TRUE;
}

SQLite3Reader *SQLite3Database::ExecuteQuery(const char *sql)
{
   int rc;
   sqlite3_stmt *stmt;


   rc = sqlite3_prepare_v2(m_db, sql, -1, &stmt, NULL);


   if(rc != SQLITE_OK)
   {
       sqlite3_finalize(stmt);
       m_errcode = _SQLITE3_DB_ERROR_;
       return NULL;
   }
   else if(rc == SQLITE_DONE)
   {
       sqlite3_finalize(stmt);
       m_errcode = _SQLITE3_DB_NO_ROW_RETURN_;
       return NULL;
   }


   return new SQLite3Reader(m_db, stmt);
}

const char *SQLite3Database::GetErrorMsg()
{
   const char *errmsg = NULL;


   switch(m_errcode)
   {
   case _SQLITE3_DB_ERROR_:
       errmsg = (const char *)sqlite3_errmsg(m_db);
       break;
   case _SQLITE3_DB_OK_:
       errmsg = "This is not an error.";
       break;
   case _SQLITE3_DB_INDEX_OVERFLOW_:
       errmsg = "Index overflow.";
       break;
   }


   return errmsg;
}

#ifdef __WXMSW__
int SQLite3Database::
   BindwxControlWithItems(wxControlWithItems *ctrlwithitem,
                           const char *sql, unsigned int index)
{
   int rc;
   sqlite3_stmt *stmt;


   ctrlwithitem->Clear();

   rc = sqlite3_prepare_v2(m_db, sql, -1, &stmt, NULL);
   if(rc != SQLITE_OK)
   {
       sqlite3_finalize(stmt);
       return FALSE;
   }


   rc = sqlite3_step(stmt);
   while(rc == SQLITE_ROW)
   {
       unsigned int column_count = (unsigned int)sqlite3_column_count(stmt);
       const char *text = NULL;


       if(index < 0 || index >= column_count)
       {
           m_errcode = _SQLITE3_DB_INDEX_OVERFLOW_;
           return FALSE;
       }


       text = (const char *)sqlite3_column_text(stmt, index);
       ctrlwithitem->Append(wxString::FromAscii(text));


       rc = sqlite3_step(stmt);
   }


   if (rc == SQLITE_DONE)
   {
       rc = TRUE;
   }
   else
   {   
       rc = FALSE;
   }


   sqlite3_finalize(stmt);


   return rc;
}

int SQLite3Database::
   BindwxTextCtrl(wxTextCtrl *textctrl, const char *sql, unsigned int index)
{
   int rc;
   sqlite3_stmt *stmt;


   textctrl->Clear();


   rc = sqlite3_prepare_v2(m_db, sql, -1, &stmt, NULL);
   if(rc != SQLITE_OK)
   {
       sqlite3_finalize(stmt);
       m_errcode = _SQLITE3_DB_ERROR_;
       return FALSE;
   }


   rc = sqlite3_step(stmt);   
   if (rc == SQLITE_DONE)
   {
       rc = TRUE;
   }
   else if(rc == SQLITE_ROW)
   {
       unsigned int column_count = (unsigned int)sqlite3_column_count(stmt);
       const char *text = NULL;


       if(index < 0 || index >= column_count)
       {
           m_errcode = _SQLITE3_DB_INDEX_OVERFLOW_;
           return FALSE;
       }


       text = (const char *)sqlite3_column_text(stmt, index);
       textctrl->AppendText(wxString::FromAscii(text));


       rc = TRUE;
   }
   else
   {   
       m_errcode = _SQLITE3_DB_ERROR_;
       rc = FALSE;
   }


   sqlite3_finalize(stmt);


   return rc;
}

int SQLite3Database::
   BindwxComboBox(wxComboBox *combobox, const char *sql, unsigned int index)
{
   return BindwxControlWithItems((wxControlWithItems *)combobox, sql, index);
}

#endif //__WXMSW__

上一篇: wxString类与char,wchar的相互转换(转)   下一篇: BAT遍历所有目录

提交疑问

回顶部