wxWidgets支援ODBC需要以下幾步

來源:互聯網
上載者:User

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 );

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.