背景
我的项目中需要C++访问达梦数据库,所以花了很大功夫来实现这个功能。
通过和达梦官方的邮件联系之后,得知现在达梦数据库(dm7)是不能在ubuntu版本的linux上安装server的,但是client还是可以安装在ubuntu上的。所以可以通过odbc来访问安装在centos上的达梦数据库。
服务端达梦的安装
在centos上安装的教程如下连接:http://blog.csdn.net/allens_zhou/article/details/8575400
ubuntu客户端配置:
首先要安装unixODBC,网上有教程;
然后安装soci,这是它的官网:soci.sourceforge.net/doc/3.2/,具体安装使用过程网上也有教程。
然后配置odbc manager和odbc driver
这个博客对我的帮助很大:http://www.itpub.net/thread-1824202-1-1.html,它指明了配置达梦odbc可以不需要libdmOdbcSet.so这个库,只要libdodbc.so就行了。具体操作见下:
- 安装完odbc后,odbcinst –j 来查看安装位置等信息
- 配置 odbcinst.ini,作用就是注册DM7的ODBC驱动,该驱动名称为DM7,内容如下:
[DM7]
Description = dm odbc
Driver = /opt/dmdbms/bin/libdodbc.so - 配置 odbc.ini,作用就是创建系统DSN,名称为dm,调用名为DM7的ODBC驱动,内容如下:
[dm]
Description = dm7 dsn
Driver = DM7
SERVER =127.0.0.1
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236 - 配置完成之后,直接在终端运行:isql dm来测试,如果返回以下信息,测说明配置成功:
[root@localhost opt]# isql dm
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+ - 还可以建表,如create table student (id int, name char(128), score int)
- 插入数据: insert into student (id, name, score) values (1,’myname’, 100)
C++通过soci访问达梦例子:
main.cpp:
#include <soci/soci.h>
#include <soci/odbc/soci-odbc.h>
#include<soci/mysql/soci-mysql.h>
#include <soci/postgresql/soci-postgresql.h>
#include<iostream>
#include<istream>
#include<ostream>
#include<string>
#include<exception>
#include<unistd.h>
using namespace std;
using namespace soci;
int main() {
// session sql("mysql://host=127.0.0.1 dbname=student user=root password=123");//建立连接
// connection_pool pool(10);
// for (int i=0; i<10; i++) {
// session &sql = pool.at(i);
// sql.open
// }
session sql("odbc://DSN=dm");
session sql0(odbc, "DSN=dm");
session sql1(odbc, "DSN=dm");
unsigned id=0;
string name("lxc_00");
int score=100;
try {
sql<<"insert into student (id, name, score) values (:item_0,:item_1, :item_2)", use(id,"item_0"),use(name,"item_1"), use(score, "item_2");
} catch (exception const & e) {
cerr<<"Error::"<<e.what()<<endl;
}
sql.close();
sql0.close();
sql1.close();
}
makefile:
all = all
cc = g++ -std=c++11 -Wall -g
source = main.cpp
LIB = -lpq -lsoci_core -lsoci_postgresql -lmysqlclient -ldl -lpthread -lsoci_odbc
INCLUDE = -I/usr/include/mysql
$(all): $(source)
$(cc) -o main $(source) $(LIB) $(INCLUDE)
clean:
rm *.o
这样就可以用C++访问达梦了!