LINUX下通过C++访问SQLSERVER数据库

时间:2022-02-17 09:13:55

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.gz
cmake -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注释位置的代码