QTDS freetds访问MSSQL

       上文介绍在linux下可以通过QODBC来访问SqlServer,我们可以发现QODBC插件内部也是调用 libsybdb.so (sybase客户端访问库,可通过安装sybase得到. freetds是TDS的开源实现库,编译后会在lib目录产生该库),只是将TDS协议用ODBC接口方式再封装了一次而已. 既然内部也是使用的TDS协议,我们为什么要舍近求远用QODBC插件来访问呢?  我们可以直接通过QTDS插件来访问SqlServer,这样效率更高. 

 

一. 编译TDS插件

    指定freetds头文件和库路径,通过Freetds来编译TDS插件  

cd $QTDIR/src/plugins/sqldrivers/tds
qmake "INCLUDEPATH=/usr/local/freetds/include" "LIBS=-L/usr/local/freetds/lib -lsybdb"
make

 

二. 配置sqlserver数据源

     Freetds会从按以下顺序搜索freetds.conf配置文件:

     1. $(FREETDSCONF) ,搜索系统FREETDSCONF环境变量是否配置

     2. ~/.freetds.conf, 如果1没找到,freetds会从用户目录下搜索 .freetds.conf文件

     3. $prefix/etc/feetds.conf,如2没找到,则搜索系统prefix环境变量

     

     我们选择方案1,将配置文件放于指定目录下,然后在程序中设置该环境变量即可,这样便于程序部署.

     freetds.conf

 

三. 测试运行

// 在程序中设置FREETDSCONF环境变量
QString conf=QString("%1/etc/freetds.conf").arg(getenv("SCADA_ROOT"));

char szBuff[256];
strcpy(szBuff,qPrintable(conf));

// 此处调用setenv才行,putenv不通过
setenv("FREETDSCONF",szBuff,1);

// 注意:此处 databaseName 和 hostName参数与windows上编码有一定的差异, 否则无法连接数据库
QSqlDatabase db=QSqlDatabase::addDatabase("QTDS");
db.setDatabaseName("sqlscada");
db.setHostName("DataSource1");  // freetds中配置的数据源名称
db.setPort(3304);
db.setUserName("sa");
db.setPassword("scada");

if(!db.open())
{
	qDebug("=== %s",qPrintable(db.lastError().text()));
}else
{
	qDebug("==== ok");
}

 

运行截图:

 QTDS freetds访问MSSQL

 

你可能感兴趣的:(MSSQL,FreeTDS,QTDS)