最近在弄qt连接sqlserver2008,总是出现如下错误提示.
[unixODBC][Driver Manager]Data source name not found, and no default driver specified QODBC3: Unable to connect
对于上述错误,我在网上找遍了,也没有找到结果.但是最后被我偶然试出来了.特此记录一下,给日后提醒.
相关的测试库,odbc,freetds,qt等等库都是要装的
首先是下面配置文件,要确保正确.
# vim /etc/freetds/freetds.conf
[factorytest]
host = 192.168.1.7
port = 1433
tds version = 8.0
# vim /etc/odbc.ini
[factorytest]
Driver = SQLServer
Description = SQLServer
Server = 192.168.1.7
Database = factorytest
Port = 1433
# vim /etc/odbcinst.ini
[ODBC]
Trace = Yes
TraceFile = /tmp/sql.log
ForceTrace = Yes
Pooling = No
[SQLServer]
Description = SQLServer
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1
CPTimeout = 5
CPReuse = 5
FileUsage = 1
//
下面是测试连接的代码
// http://stackoverflow.com/questions/12660406/connecting-to-sql-server-2005-through-qt-c
#include<QtCore/QCoreApplication>
#include<QWidget>
#include<ostream>
#include<iostream>
#include<QFile>
#include<QTime>
#include<stdio.h>
#include<QTextStream>
#include<QSqlDatabase>
#include<QSqlError>
#include<QSqlDriver>
#include<QDebug>
using namespace std;
QString buildDSN(QString server, QString database, QString username, QString password)
{
QString dsn = QString("DRIVER={SQLSERVER};SERVER=%1;TDS_VERSION=8.0;PORT=1433;DATABASE=%2;UID=%3;PWD=%4;")
.arg(server).arg(database).arg(username).arg(password);
return dsn;
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
for(int i = 0; i < drivers.size(); i++)
{
qDebug() << drivers[i];
}
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "factorytest");
// QString dsn = QString::fromLocal8Bit(
// "DRIVER={SQL SERVER};"
// "SERVER=192.168.1.7;"
// "DATABASE=factorytest;"
// "UID=sa;"
// "PWD=root;");
#if 0
//"DRIVER={FreeTDS};"
QString dsn = QString("DRIVER={SQLSERVER};"
"SERVER=192.168.1.7;"
"TDS_VERSION=8.0;"
"PORT=1433;"
"DATABASE=factorytest;"
"UID=sa;"
"PWD=root;");
// QString dsn = "factorytest";
db.setHostName("192.168.1.7");
db.setPort(1433);
db.setDatabaseName(dsn);
db.setUserName("sa");
db.setPassword("root");
#endif
#if 1
QString server = "192.168.1.7";
QString database = "factorytest";
QString username = "sa";
QString password = "root";
db.setDatabaseName(buildDSN(server, database, username, password));
#endif
bool test = db.isValid();//true
cout << "test = " << test << endl;
bool r = db.open();
if(r)
{
cout << endl << "+connected [OK]" << endl;
}
else
{
cout << endl << "-connected [NG]" << endl;
QString error = db.lastError().text();
cout << error.toLocal8Bit().data() << endl;;
}
return 0; //app.exec();
}