SQLite,是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,支持跨平台,操作簡單,能夠使用很多語言直接創建數據庫。
官方網站:www.sqlite.org
在VC環境下編寫連接SQLite的方法,網上有很多種,自己試驗了其中一種,感覺還不錯,下面記錄下來,使用到的文件包括官方網站下載的文件和CodeProject上的SQLite3Wrapper封裝(http://www.codeproject.com/KB/windows/SQLite3Wrapper.aspx)
測試環境:Windows 7
編程環境:Visual Studio 2008 SP1
第一步:新建基於對話框的工程,名稱為SQLiteTest;
第二步:添加sqlite3.h、sqlite3i.h、DbSqlite.h、DbSqlite.cpp四個文件到工程;
第三步:在對話框上添加兩個按鈕,一個LIST列表控件,修改其VIEW屬性為report,為其添加變量m_ListCtrl;
第四步:把“w32SQLite3.lib”放到工程的目錄下,右鍵點擊解決方案里面項目的“屬性”,在“鏈接器”的“輸入”的“附加依賴項”填入“w32SQLite3.lib”;
第五步:在對話框的實現文件里面添加頭文件
#include "DbSQLite.h"
第六步:“創建一張表”按鈕的代碼:
void CSQLiteTestDlg::OnBnClickedCreateButton()
{
bool fTest;
CDbSQLite sqlite;
//連接打開SQLite數據庫
fTest = sqlite.Open(_T("theTestSqlite.db"));
if (!fTest)
{
AfxMessageBox(_T("打不開theTestSqlite.db"));
return;
}
//執行創建表語句
fTest = sqlite.DirectStatement(_T("CREATE TABLE usersInfo(name varchar(30), password varchar(20))"));
if (!fTest)
AfxMessageBox(_T("不能創建表usersInfo"));
//新增數據
CString szQuery;
szQuery = _T("INSERT INTO usersInfo VALUES ('xiaoWang','123')");
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入數據失敗!"));
szQuery = _T("INSERT INTO usersInfo VALUES ('daWang','322')");
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入數據失敗!"));
AfxMessageBox(_T("創建表成功,插入數據成功!"));
}
{
bool fTest;
CDbSQLite sqlite;
//連接打開SQLite數據庫
fTest = sqlite.Open(_T("theTestSqlite.db"));
if (!fTest)
{
AfxMessageBox(_T("打不開theTestSqlite.db"));
return;
}
//執行創建表語句
fTest = sqlite.DirectStatement(_T("CREATE TABLE usersInfo(name varchar(30), password varchar(20))"));
if (!fTest)
AfxMessageBox(_T("不能創建表usersInfo"));
//新增數據
CString szQuery;
szQuery = _T("INSERT INTO usersInfo VALUES ('xiaoWang','123')");
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入數據失敗!"));
szQuery = _T("INSERT INTO usersInfo VALUES ('daWang','322')");
fTest = sqlite.DirectStatement(szQuery);
if (!fTest)
AfxMessageBox(_T("插入數據失敗!"));
AfxMessageBox(_T("創建表成功,插入數據成功!"));
}
第七步:“預覽數據”按鈕的代碼:
void CSQLiteTestDlg::OnBnClickedLookButton()
{
BOOL fTest;
CDbSQLite sqlite;
fTest = sqlite.Open(_T("theTestSqlite.db"));
if (!fTest)
{
AfxMessageBox(_T("打不開theTestSqlite.db"));
return;
}
CSqlStatement *stmt = sqlite.Statement(_T("SELECT * FROM usersInfo"));
//當數據不為空的時候,填充LIST控件
if (stmt != NULL)
{
m_ListCtrl.DeleteAllItems(); //清除LIST項
while(m_ListCtrl.DeleteColumn(0));//清除LIST列項
CRect rect;
m_ListCtrl.GetWindowRect(&rect); //獲得LIST控件大小
int nFields = stmt->Fields(); //取得數據庫表的列數
int nWidth = (rect.Width() - rect.Width() * 0.02) / nFields; //平均分布列數
int nCol = 0;
int nRow = 0;
CString szText;
for(nCol = 0; nCol < nFields; nCol++)
{
szText = stmt->FieldName(nCol); //得到列名
m_ListCtrl.InsertColumn(nCol, szText, LVCFMT_LEFT, nWidth, nCol);
}
while (stmt->NextRow())
{
szText = stmt->ValueString(0); //得到列值
m_ListCtrl.InsertItem(nRow, szText);
for(nCol = 1; nCol < nFields; nCol++)
{
szText = stmt->ValueString(nCol); //得到列值
m_ListCtrl.SetItem(nRow, nCol, LVIF_TEXT, szText, 0, 0, 0, 0);
}
++nRow;
}
}
delete stmt;
UpdateData(FALSE);
}
{
BOOL fTest;
CDbSQLite sqlite;
fTest = sqlite.Open(_T("theTestSqlite.db"));
if (!fTest)
{
AfxMessageBox(_T("打不開theTestSqlite.db"));
return;
}
CSqlStatement *stmt = sqlite.Statement(_T("SELECT * FROM usersInfo"));
//當數據不為空的時候,填充LIST控件
if (stmt != NULL)
{
m_ListCtrl.DeleteAllItems(); //清除LIST項
while(m_ListCtrl.DeleteColumn(0));//清除LIST列項
CRect rect;
m_ListCtrl.GetWindowRect(&rect); //獲得LIST控件大小
int nFields = stmt->Fields(); //取得數據庫表的列數
int nWidth = (rect.Width() - rect.Width() * 0.02) / nFields; //平均分布列數
int nCol = 0;
int nRow = 0;
CString szText;
for(nCol = 0; nCol < nFields; nCol++)
{
szText = stmt->FieldName(nCol); //得到列名
m_ListCtrl.InsertColumn(nCol, szText, LVCFMT_LEFT, nWidth, nCol);
}
while (stmt->NextRow())
{
szText = stmt->ValueString(0); //得到列值
m_ListCtrl.InsertItem(nRow, szText);
for(nCol = 1; nCol < nFields; nCol++)
{
szText = stmt->ValueString(nCol); //得到列值
m_ListCtrl.SetItem(nRow, nCol, LVIF_TEXT, szText, 0, 0, 0, 0);
}
++nRow;
}
}
delete stmt;
UpdateData(FALSE);
}
第八步:把“w32SQLite3.dll”放到Debug文件夾下。
完成,編譯程序,結果如下圖所示: