安装
linux 下的ODBC 有两种:unixODBC 和iodbc ,由于wxGTK 提供的是对iodbc 的支持,因此在安装wxGTK 前需要先安装iodbc 。在后面安装freetds 时,依据环境和依赖关系可能会将unixODBC 也装上,iodbc 和unixODBC 修改的ODBC 配置文件都是/etc/odbc.ini 和/etc/odbcinst.ini ,这两个都是ODBC 驱动的管理器,没有冲突问题,但如果要使用wxODBC 进行ODBC 的开发,iodbc 是必须要安装的。
-
安装 iodbc
如果有yum 源中包括libiodbc ,可直接使用yum install libiodbc* 或在yumex 中搜索iodbc 的包进行安装,否则需要到网上下载相关的rpm 包进行安装。
下载libiodbc-3.52.6-1.i386.rpm
下载libiodbc-devel-3.52.6-1.i386.rpm
下载 libiodbc-admin-3.52.6-1.i386.rpm
下载libiodbc-3.52.6-1.src.rpm
rpm -ivh libiodbc-3.52.6-1.i386.rpm
rpm -ivh libiodbc-devel-3.52.6-1.i386.rpm
rpm -ivh libiodbc-admin-3.52.6-1.i386.rpm
rpm -ivh libiodbc-3.52.6-1.src.rpm
-
安装wxGTK
./configure --with-odbc --enable-monolithic --enable-xrc --enable-unicode
make
make install
-
安装 codeblocks
cp /usr/local/share/aclocal/wxwin.m4 /usr/share/aclocal/wxwine.m4
./bootstrap ( 可能需执行aclocal)
./configure --with-contrib-plugins=all
make
makeinstall
连接 SQL Server
-
安装 freetds
yum install freetds *
( 或安装yum yumex 后,执行yumex ,到所有包里搜索freetds, 安装找到的包,有三个,另两个是develop 包和doc 包)
-
配置 ODBC 驱动
/usr/bin/iodbcadm-gtk
到ODBC Drivers 中点ADD a driver
在description of driver 中填入对驱动连接数据库的描述如MSSQL 或SQL server
在driver file name 中填入/usr/lib/libtdsodbc.so( 具体路径可能有因版本有差异,可搜索libtdsodbc.so 找到具体的路径)
在Setup file name 中填入/usr/lib/libtds.so( 具体路径可能有差异)
点击OK 保存ODBC 驱动的设置
-
配置 DSN
在 iodbcadm-gtk 切换到system DSN
点击Add, 在出现的窗口中选择要使用的配置好的驱动后点击OK
Data Source Name (DSN) 中填入新建的DSN 源的名称
新建如下Keyword, 并填入值
Keyword Value
Database 使用的数据库
Port 使用的端口号(SQL Server 为1433)
Server 服务器( 可使用IP 地址)
TDS_Version 8.0
Trace No
点OK 保存DSN
点击Test 测试该数据源,弹出窗中填入用户名密码后点OK 看测试情况
点OK 退出iodbcadm-gtk
可使用
isql -v DSN 名 用户名 密码
连接DSN
MySQL
-
安装驱动
用yumex 检查mysql-connector-odbc 包有没有安装,如果没有,使用yum install mysql-connector-odbc 进行安装
-
配置 ODBC 驱动
在iodbcadm-gtk 中切换到ODBC Drivers ,点击ADD a driver
在description of driver 中填入对驱动连接数据库的描述如MySQL
在driver file name 中填入/usr/lib/libmyodbc3.so( 名称按mysql 的驱动版本可能不同,如可能会是libmyodbc.so )
在Setup file name 中填入/usr/lib/libodbcmyS.so 具体路径可能有差异)
点击OK 保存ODBC 驱动的设置
-
配置 DSN
在 iodbcadm-gtk 切换到system DSN
点击Add, 在出现的窗口中选择要使用的配置好的驱动后点击OK
Data Source Name (DSN) 中填入新建的DSN 源的名称
新建如下Keyword, 并填入值
Keyword Value
Database 使用的数据库
Server 服务器( 可使用IP 地址)
user 用户名
password 密码
点OK 保存DSN
然后可点Test 测试或在命令行下用
isql -v DSN 名 用户名 密码
测试
注 : 如果在iodbcadm-gtk 下无法保存DSN 的Keyword 和Value ,可直接编辑/etc/odbc.ini 进行配置。
WxODBC 的开发
-
头文件
<wx/db.h>
<wx/dbtable.h>
-
相关的类及使用方法
wxDbConnectInf 数据源连接信息
wxDb 数据连接
wxDbTable 表
wxDbConnectInf 用来创建数据源的连接信息,构造函数的定义如下:
wxDbConnectInf(HENV henv, //ODBC 环境句柄
const wxString &dsn, // 数据源
const wxString &userID = "", // 数据库用户名
const wxString &password, // 数据库密码
const wxString &defaultDir = "", // 特定路径 ( 可选 )
const wxSting &description = "", // 默认为空
const wxString &fileType = "") // 默认为空
henv 一般情况下使用NULL ,即由系统自动创建环境句柄。
使用ODBC 连接数据库有两种方法,使用DSN 的方式和使用驱动的方式,这两种方式都要用到wxDbConnectInf 建立连接信息,但使用DSN 方式时必须指明数据源,在使用驱动方式时数据源可填入空字符串.
wxDbGetConnection ()方法及wxDB 类的对象用来获得数据连接。
wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
wxDbTable 为表对象
wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, const wxString &qryTblName = “”, bool qryOnly = !wxDB_QUERY_ONLY, const wxString &tblPath = “”)
参数:
pwxDb :wxDb 的指针
tblName :数据库中的表名
numColumns :表的列数
qryTblName :查询得到的数据的表名
qryOnly :查询得到数据的读写权限
tblPath :有些数据源需要特定路径
-
示例代码
wxDbConnectInf *DbConnectInf = NULL;
wxDb *db = NULL;// 声明一个wxDB 对象来获得数据连接
wxDbTable *table = NULL;
wxChar name[50+1]; //table 的数据成员,用来绑定数据库表中字段
int id;
float value;
wxString sqlstr;
DbConnectInf = new wxDbConnectInf(NULL,wxT("testsqlserver"),wxT("sa"),wxT("sa"));
if (!DbConnectInf || !DbConnectInf->GetHenv())// 连接并判断结果
{
wxMessageBox(wxT("DB ENV ERROR: Cannot allocate ODBC env handle"));
}
else
{
wxMessageBox(wxT("DB connected"));
}
db = wxDbGetConnection(DbConnectInf);
if (!db)// 判断是否获得连接
{
wxMessageBox(wxT("CONNECTION ERROR – Cannot get DB connection"));
}
else
{
wxMessageBox(wxT("get DB connection success"));
}
table = new wxDbTable(db, wxT("xh"), 3, wxT(""), wxDB_QUERY_ONLY, wxT(""));
/* 将table 中的变量与数据库中的字段进行绑定*/
table->SetColDefs(0, wxT("name"), DB_DATA_TYPE_VARCHAR, name, SQL_C_WXCHAR, sizeof(name), true, true);
table->SetColDefs(1, wxT("ID"), DB_DATA_TYPE_INTEGER, &id,SQL_C_LONG, sizeof(id), true, true);
table->SetColDefs(2 ,wxT("value"), DB_DATA_TYPE_FLOAT, &value,SQL_C_FLOAT, sizeof(value), true, true);
if (!table->Open())
{
wxMessageBox(wxT("TABLE OPEN ERROR: "));
}
else
{
wxMessageBox(wxT("TABLE OPEN success: "));
}
sqlstr = wxT("update mytable set value = value + 50");
if (table->QueryBySqlStmt(sqlstr))
{
wxMessageBox(wxT("update success"));
}
sqlstr = wxT("select * from mytable where id in (select id from xh)");
if (table->QueryBySqlStmt(sqlstr))
{
while (table->GetNext())
{
wxMessageBox(wxString::Format(wxT("%d"),table->GetRowNum()));
TextCtrl1->SetValue(wxString::Format(wxT("%s"), name));
TextCtrl2->SetValue(wxString::Format(wxT("%d"), id));
TextCtrl3->SetValue(wxString::Format(wxT("%f"), value));
}
}
wxDELETE(table);// 删除已使用完table
wxDbFreeConnection(db);// 释放连接
db = NULL;
wxDbCloseConnections();// 关闭所有连接
wxDELETE(DbConnectInf);// 释放ODBC 环境句柄
上面的代码使用的是DSN 连接方式
wxDbTable 必须绑定一个实际的表,并且open 之后才能使用SQL ,但表名和SQL 无关,上面的代码中, wxDbTable 创建时绑定的是xh 这个表,但在后面的提交SQL 的update 语句和Select 语句的操作对象是mysql 表。
WxDbTable 取值时必须将实际的变量和字段进行绑定,绑定使用
SetColDefs(UWORD index, const wxString &fieldName, int dataType,
void *pData, SWORD cType,
int size, bool keyField = false, bool updateable = true,
bool insertAllowed = true, bool derivedColumn = false);
上面的例子中
table->SetColDefs(0, wxT("name"), DB_DATA_TYPE_VARCHAR, name, SQL_C_WXCHAR, sizeof(name), true, true);
table->SetColDefs(1, wxT("ID"), DB_DATA_TYPE_INTEGER, &id,SQL_C_LONG, sizeof(id), true, true);
table->SetColDefs(2 ,wxT("value"), DB_DATA_TYPE_FLOAT, &value,SQL_C_FLOAT, sizeof(value), true, true);
在mytable 表中name 字段是varchar 类型,ID 字段是int 类型,value 字段是float 类型,因此上边的代码中绑定的类型是不一样的。
如上面所示,执行查询后,使用WxDbTable 的GetNext() 就可以取值并移动指针,记录的值会放入到字段绑定的变量中。