1) 首先需要wxWidgets庫的支援
在編譯wxWidgets庫的時候將wxWidgets\include\wx\msw\setup.h的wxUSE_ODBC設為1
2) 需要使用wxWidgets的ODBC的lib
\wxWidgets\lib\vc_lib\wxbase28d_odbc.lib(wxbase28_odbc.lib)\
\Microsoft Visual Studio\VC98\Lib\odbc32.lib
3) 配置資料來源
分為:使用者DSN、系統DSN、檔案DSN,但一般之對配置使用者DSN、系統DSN有效
4) 例子
#include <wx/db.h>
#include <wx/dbtable.h>
//配置環境
wxDbConnectInf *env = NULL;
env = new wxDbConnectInf(NULL, wxT("DSN"), wxT("UserName"), wxT("PassWord"));
//建立串連
wxDb* conn = NULL;
conn = wxDbGetConnection(env);
wxDbTable* tbl = new wxDbTable(conn, wxT("mine"), 2,wxT(""),wxDB_QUERY_ONLY, wxT(""));
//定義儲存列內容的變數
wxString sst;
wxChar ID[100];
wxChar str[100+1];
//有幾列就定義幾列
tbl->SetColDefs(0, wxT("ID"), DB_DATA_TYPE_VARCHAR,ID, SQL_C_NUMERIC, sizeof(ID), true, true);
tbl->SetColDefs(1, wxT("name"), DB_DATA_TYPE_VARCHAR, str,SQL_C_WXCHAR, sizeof(str), true, true);
//開啟DbTable對象
if( !tbl->Open())
{
wxMessageBox("error");
return;
}
//查詢
if( !tbl->Query())
{
wxMessageBox("error");
return;
}
//讀取變數
While( tbl->GetNext() )
{
Sst.Printf(wxT("%s|%s"), ID, str);
wxMessageBox(sst);
}
//關閉DbTable對象
if(tbl)
{
Delete tbl;
tbl = 0;
}
//關閉串連
if(conn)
{
wxDbFreeeConnection(conn);
conn = 0;
}
//釋放環境
env->FreeHenv()
5) SetColsDefs中資料關係的對應
-------------------------------------------------------------------
C++對應變數 dataType(邏輯資料類型) cType(SQL中資料類型)
-------------------------------------------------------------------
wxChar DB_DATA_TYPE_VARCHAR SQL_VARCHAR
SQL_LONGVARCHAR
DB_DATA_TYPE_DATE SQL_C_DATE
DB_DATA_TYPE_INTEGER SQL_C_BIT
wxChar DB_DATA_TYPE_VARCHAR SQL_NUMERIC
DB_DATA_TYPE_FLOAT SQL_REAL
-------------------------------------------------------------------
6) 開啟資料庫連接的兩種方法
wxDbConnectInf *env = NULL;
wxDb* conn = NULL;
env = new wxDbConnectInf(NULL, wxT("DSN"),wxT("UserName"),wxT("PassWord"));
//方法一
conn=new wxDb(env->GetHenv());
if(!conn->Open(env))
{
wxMessageBox("不能建立串連","DB CONNECTION ERROR", wxOK | wxICON_EXCLAMATION);
}
//方法二
conn=wxDbGetConnection(env);
使用wxTable訪問資料庫大概步驟
1) Define datasource connection information //設定資料來源串連資訊
//使用wxDbConnectInf類對象設定資料來源串連資訊:
wxDbConnectInf(HENV henv, //ODBC環境控制代碼
const wxString &dsn, //資料來源
const wxString &userID = "", //資料庫使用者名稱
const wxString &password, //資料庫密碼
const wxString &defaultDir = "", //特定路徑(可選)
const wxSting &description = "", //預設為空白
const wxString &fileType = "") //預設為空白
/*********************************************************************************
參見wx協助wxDbConnectInf,一般情況henv設定為NULL,在構造時自動建立,當然也可以用
AllocHenv()分配
*********************************************************************************/
if( !DbConnectInf || !DbConnect->GetHenv() )
{
//串連並判斷串連結果是否成功
}
2) Get a datasource connection //獲得資料連線
//使用wxDbGetConnection()方法及wxDb()類對象獲得資料連線
wxDbGetConnection( wxDb* InfConfig ); // InfConfig:資料來源設定資訊
wxDb *db = NULL;
db = wxDbGetConnection(DbconnectInf);
if ( !db )
{
//也要判斷是否獲得串連,即db是否為真;
}
3) Create table definition //建立表對象
wxDbTable(wxDb *pwxDb, //wxDb指標
const wxString &tblName, //資料庫表名
const UWORD numColumns, //表列數
const wxString &qryTblName = "", //查詢得到的資料表名
bool qryOnly = !wxDB_QUERY_ONLY, //查詢得到說資料的讀寫權
const wxString& tablPath = "") //有些資料來源需要特定路徑
//這一步可以用dbWizard產生工具自動產生,如果手動寫代碼如下
wxDbTable *table = NULL;
const wxChar tableName[] = wxT( "test/*表名*/" );
const UWORD numTableColumns = 2;
wxChar FiestName[50+1]; //table表的資料成員,用來綁定資料庫中欄位
wxChar LastName[50+1];
table = new wxDbTbale ( db,
tableName,
numTableColumns,
wxT("") ,
!wxDB_QUERY_ONLY,
wxT("") );
/*將table中的變數與資料庫中欄位進行綁定*/
table->SetColDefs(0, wxT("FIRST_NAME"), DB_DATA_TYPE_VARCHAR, FirsName, SQL_C_WXCHAR, sizeof(FirstName), true , true);
table->SetColDefs(0, wxT("LAST_NAME"), DB_DATA_TYPE_VARCHAR, FirsName, SQL_C_WXCHAR, sizeof(LastName), true , true);
/*********************************************************************************
在理解table時,一定要把它當成對象,這個對象由我們按照自己的需求來建立,這個對象與
資料庫中的表相對應, 我們對這個對象的控制實際上就是資料庫中表的控制,這個對象的資料
成員自然葉由我們來定,比如我們在建立一個對象時並不需要資料庫表中的所有欄位,我們只
需要SetColDefs()綁定我們需要的欄位即可。要注意的是,tableName是資料庫中表名,我們
需要訪問哪個表時,就建立一個vwxdbtable對象與之對應,理解了這個我們操作資料庫就簡單
了,如果我們new了一個新表名,哪麼我們可以用Creat()函數在資料庫中建立一張新表。
*********************************************************************************/
4) Open the table //開啟表
if(!table->Open())
{
//判斷開啟表是否成功
}
5) User the table //使用表
//添加新記錄
wxStrcpy(FirstName, wxT("Julian")); //FirstName所綁定的欄位將添加一條記錄
/*********************************************************************************
其他同理,注意wxChar的欄位不能用=賦值,只能用wxStrcpy。int、long等這些類欄位可以
直接=賦值
*********************************************************************************/
if(!table->Insert())
{
//判斷添加是否成功
}
//提交更新資料庫
Table->GetDb()->CommitTrans();
//查詢記錄,實際上就是用SQL語句來執行
wxString sql = "select * from Table" //根據自己的需要寫查詢語句
if (table->QueryBySqlStmt(sql) )
{
//判斷是否查詢成功
}
//刪除記錄
if(!table->DeleteWhere(where) //where表示刪除的條件可以為SQL語句
{
//判斷是否刪除成功
}
6) Close the table //關閉表
//刪除已使用完的table
wxDELETE( table );
7) Close the datasource connection //關閉串連
//釋放串連
wxDbFreeConnection( db );
db = NULL;
//關閉所有串連
wxDbCloseConnections();
8) Release the ODBC environment handle //釋放ODBC環境控制代碼
wxDELETE( DbConnectInf );
不使用wxTable訪問資料庫
資料庫連接還是用上面的方法,在完成連
接後,使用wxDb對象的ExeSql()、GetData()、GetNext()等方法來實現對資料
庫的操作
1) ExecSql()函數: //實質上還是執行SQL語句
bool ExecSql ( const wxString &psqlStmt ) //SQL語句
bool ExecSql ( const wxString &psqlStmt, //SQL語句
wxDbColInf **columns, //wxDbColInf對象的指標
short &numcols ) //numcols:涉及到參數變數
2) GetData()函數: //查詢結果
bool GetData(UWORD colNumber, //想查詢的結果的列
SWORD cType, //傳回值的資料類型
PTR pData, //儲存查詢結果緩衝池
SDWORD maxLen, //緩衝池的大小
SDWORD FAR *cbReturned ) //查詢結果在緩衝池的大小
3) GetNext()函數: //返回遊標當前位置的下行
//相應的函數GetFirst(),GetLast(),具體參見wx協助;
4) Sample Code:
wxDbConnectInf *DbConnectInf = NULL;
wxDb* pDb = NULL;
DbConnectInf = new wxDbConnectInf( NULL, //Henv一般為NULL,也可自己設定
wxT(""), //此項為資料來源(DSN)
wxT(""), //資料庫使用者名稱
wxT("") ); //資料庫密碼
if ( !DbConnectInf || !DbConnctInf->GetHenv() )
{
//串連判斷並結果是否成功
}
pDb = wxDbGetConnection( DbConnectInf );
if ( !Db )
{
//判斷是否串連成功
}
/*對資料庫進行查詢,查詢Cus中大的資料庫表*/
SDWORD cb; //返回結果的大小,用來判斷是否有查詢結果
wxChar reqQty[50+1]; //儲存查詢結果
wxChar reqQty1[50+1]; //儲存查詢結果
wxString sqlStmt; //SQL語句
sqlStmt = "select * from " //表 where 條件;
sqlStmt += SQL_Users; //#define SQL_Users “USERS”
//wxMessageBox( sqlStmt ); //測試SQL語句是否正確
if ( !pDb->ExecSql( sqlStmt.c_str() ) ) //執行SQL語句
{
//判斷是否執行成功
}
int n = 0; //表格行數
while (pDb->GetNext () ) //獲得當前遊標位置下一條記錄
{
if ( !pDb->GetData( 2, DB_DATA_TYPE_VARCHAR, &repQty1,sizeof(reqQty1), & cb ) )
{
//判斷擷取資料是否成功
}
if ( cb == SQL_NULL_DATA )
{
//判斷是否讀取到內容
}
/*將得到的資料放入控制項,此處為grid為例*/
m_grid->AppendRows(1);
m_grid->AppendCols(2);
m_grid->SetCellValue(reqQty, n, 0);
m_grid->SetCellValue(reqQty, n, 1);
n++;
}
5) 使用完資料庫,清理工作
wxDbFreeConnection ( pDb );
pDb = NULL;
wxDbCloseConnections();
wxDELETE( DbConnectInf );