LINUX下通过C++访问微软的数据库,有点麻烦。微软官方的LINUX数据库驱动支持不好,本例通过unixODBC,使用freeTDS驱动,再通过SOCI封装的ODBC方式访问数据库(具体版本:unixODBC-2.3.4.tar.gz和freetds-0.95.19.tar.gz)
1、安装unixODBC
tar -xvf unixODBC-2.3.0.tar.gz
./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --enable-gui=no --enable-drivers=no --enable-iconv=yes --with-iconv-char-enc=GB18030 --with-iconv-ucode-enc=UTF16LE
make
make install
2、安装freetds驱动
tar -xvf freetds-patched.tar.gz
configure
make
make install
安装完成后,用isql命令来验证是否能成功连接到Sql Servcer数据库,一定要这一步验证了后,才能继续编码开发
3、安装SOCI
tar -xvf soci-3.2.2.tar.gzcmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=./inss -DWITH_BOOST=OFF -DWITH_MYSQL=OFF -DWITH_ORACLE=OFF -DWITH_POSTGRESQL=OFF -DWITH_SQLITE3=OFF -DWITH_FIREBIRD=OFF -DWITH_DB2=OFF
make
make install
4、编写简单的SOCI代码来测试连接问题
5、验证读写中文是否乱码
如果有问题或者直接报错,记得加上ODBC的日志odbcinst.ini文件中增加:
[ODBC]
TraceFile = /tmp/sql.log
Trace = Yes
如果报错如下,可以再freeTDS配置中加上字符编码
DIAG [HY000] [FreeTDS][SQL Server]Error converting characters into server's character set. Some character(s) could not be converted 配置FREETDS:/usr/local/etc/freetds.conf,增加: client charset = GB18030
X、其他
一、微软官方的驱动不能用,除了中文乱码外,还断断续续的不稳定二、FREETDS版本0.95.0存在内存泄露,换用0.95.19解决问题
三、写入数据库时,字符串会多一位(ASCII为0),需要修改backends/odbc/vector-use-type.cpp文件中// add one for null注释位置的代码