linux下odbc的安装配置和wxODBC的开发

  1. 安装

    linux 下的ODBC 有两种:unixODBCiodbc ,由于wxGTK 提供的是对iodbc 的支持,因此在安装wxGTK 前需要先安装iodbc 。在后面安装freetds 时,依据环境和依赖关系可能会将unixODBC 也装上,iodbcunixODBC 修改的ODBC 配置文件都是/etc/odbc.ini/etc/odbcinst.ini ,这两个都是ODBC 驱动的管理器,没有冲突问题,但如果要使用wxODBC 进行ODBC 的开发,iodbc 是必须要安装的。

  1.  
    1. 安装 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

 

  1.  
    1. 安装wxGTK

./configure --with-odbc --enable-monolithic --enable-xrc --enable-unicode

make

make install

 

  1.  
    1. 安装 codeblocks

cp /usr/local/share/aclocal/wxwin.m4 /usr/share/aclocal/wxwine.m4

./bootstrap ( 可能需执行aclocal)

./configure --with-contrib-plugins=all

make

makeinstall

  1. 连接 SQL Server

  1.  
    1. 安装 freetds

yum install freetds

( 或安装yum yumex 后,执行yumex ,到所有包里搜索freetds, 安装找到的包,有三个,另两个是develop 包和doc)

 

  1.  
    1. 配置 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 驱动的设置

 

  1.  
    1. 配置 DSN

iodbcadm-gtk 切换到system DSN

点击Add, 在出现的窗口中选择要使用的配置好的驱动后点击OK

Data Source Name (DSN) 中填入新建的DSN 源的名称

新建如下Keyword, 并填入值

Keyword Value

Database 使用的数据库

Port 使用的端口号(SQL Server1433)

Server 服务器( 可使用IP 地址)

TDS_Version 8.0

Trace No

OK 保存DSN

点击Test 测试该数据源,弹出窗中填入用户名密码后点OK 看测试情况

OK 退出iodbcadm-gtk

可使用

isql -v DSN 名 用户名 密码

连接DSN

 

  1. MySQL

  1.  
    1. 安装驱动

yumex 检查mysql-connector-odbc 包有没有安装,如果没有,使用yum install mysql-connector-odbc 进行安装

 

  1.  
    1. 配置 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 驱动的设置

 

  1.  
    1. 配置 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 下无法保存DSNKeywordValue ,可直接编辑/etc/odbc.ini 进行配置。

 

  1. WxODBC 的开发

  1.  
    1. 头文件

<wx/db.h>

<wx/dbtable.h>

 

  1.  
    1. 相关的类及使用方法

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 :有些数据源需要特定路径

 

  1.  
    1. 示例代码

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() 就可以取值并移动指针,记录的值会放入到字段绑定的变量中。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值