wxWidgets支持ODBC

来源:互联网 发布:解封淘宝店铺 编辑:程序博客网 时间:2024/05/04 02:41
 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 );