[转]wxWidgets支持ODBC需要以下几步
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 );