2012-09-30 495 views
1

我有一臺windows server 2003的服務器,其本地網絡上的IP爲192.168.1.220 此服務器安裝了SOL server 2005 express版本。這個SQL服務器有一個名爲amir的數據庫。通過QT C++連接到SQL Server 2005

我想從同一網絡上的Linux客戶端連接到它。 SQL服務器服務使用端口1617在我的服務器上,我用這個端口連接到使用java的服務器。

哇我想使用QT C++,但我的代碼無法正常工作。

這是我的代碼:

#include <QtCore/QCoreApplication> 
#include <iostream> 
#include <QSqldatabase> 
#include <QSqldriver> 
int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); 
    bool test=db.isValid();//true 
    test=db.isDriverAvailable("QODBC");//true 
    db.setHostName("192.168.1.220\\SQLEXPRESS"); 
    db.setDatabaseName("DRIVER={SQL Server};SERVER=192.168.1.220\\SQLEXPRESS:1617;DATABASE=amir"); 
    db.setUserName("sa"); 
    db.setPassword("amir"); 
    db.setPort(1617); 
    test=db.isValid();//true 
    if(!db.open()) 
    { 
     cout<<endl<<"not connected"<<endl; 
     QString error=db.lastError().text(); 
     cout<<error.toLocal8Bit().data(); 
     return false; 
    } 
    else 
     cout<<endl<<"connected"<<endl; 
     return true; 
} 

每次我嘗試這個吧「未連接」的錯誤是

[的unixODBC] [驅動程序管理器]數據源名稱未找到,並沒有指定默認驅動程序QODBC3:無法連接

使用這些參數,我可以用java

連接

那麼這裏有什麼問題?以及是否有另一種使用qt C++而不是ODBC驅動程序連接到SQL服務器的方法。

+0

你必須用QODBC插件配置你的Qt(你需要添加選項-qt-sql-odbc或-plugin-sql-odbc) – Blood

+0

你的意思是我需要在我的linux上安裝qt-sql-odbc,首先配置它以連接到我的服務器上的SQL服務器?正如我在Windows XP中的ODBC管理>? –

+1

這個插件安裝在我的linux上如何配置QODBC?以及如何更改我的代碼 –

回答

0

您需要在服務器上設置數據源名稱以通過ODBC進行連接。下面是一些代碼,我用它來建立一個DSN:

QString SQLServerProvider::buildDSN(QString server, QString database, QString username, QString password) 
{ 
#ifdef Q_WS_MACX 
    QString dsn = QString("DRIVER=/usr/local/lib/libtdsodbc.so;SERVER=%1;TDS_VERSION=8pClient;DATABASE=%2;PORT=1433;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password); 
#endif 

#ifdef Q_WS_X11 
    QString dsn = QString("DRIVER={FreeTDS};SERVER=%1;TDS_VERSION=8.0;PORT=1433;DATABASE=%2;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password); 
#endif 

#ifdef Q_WS_WIN 
    QString dsn = QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password); 
#endif 
    return dsn; 
} 
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", databaseName); 
db.setDatabaseName(buildDSN(server, database, username, password)); 

下面是一些代碼,我忘了在戰後初期:

#ifdef Q_WS_X11 
    QString dir = QDir::homePath(); 
    QDir d; 
    QString libdir = d.absolutePath(); 

    QFile odbcinst(dir + "/.odbcinst.ini"); 
    if(!odbcinst.exists()) 
    { 
     odbcinst.open(QIODevice::WriteOnly | QIODevice::Text); 
     QTextStream out(&odbcinst); 
     out << "[FreeTDS]\n"; 
     out << "Description = v0.91 with protocol v8.0\n"; 
     out << "Driver = " + libdir + "/libtdsodbc.so\n"; 
     out << "Setup = " + libdir + "/libtdsodbc.so\n"; 
     out << "FileUsage = 1"; 
     odbcinst.close(); 
    } 
    else 
    { 
     QList<QString> lines; 

     odbcinst.open(QIODevice::ReadOnly | QIODevice::Text); 
     QTextStream readfile(&odbcinst); 

     int i = 0, lnbr = 0; 
     bool found = false; 
     while(!readfile.atEnd()) 
     { 
      QString line = readfile.readLine(); 
      if(line.contains("[FreeTDS]")) 
      { 
       lnbr = i; 
       found = true; 
      } 
      lines.append(line); 
      i++; 
     } 
     odbcinst.close(); 

     // append to end 
     if(!found) 
     { 
      // append to the end 
      odbcinst.open(QIODevice::Append | QIODevice::Text); 
      QTextStream file(&odbcinst); 

      file << "\n[FreeTDS]\n"; 
      file << "Description = v0.91 with protocol v8.0\n"; 
      file << "Driver = " + libdir + "/libtdsodbc.so\n"; 
      file << "Setup = " + libdir + "/libtdsodbc.so\n"; 
      file << "FileUsage = 1"; 
      odbcinst.close(); 
     } 
     else // update existing entry 
     { 
      qDebug() << "Found an entry for FreeTDS. Updating driver to " + libdir + "/libtdsodbc.so."; 
      qDebug() << lines[lnbr+2]; 
      qDebug() << lines[lnbr+3]; 

      lines.replace(lnbr + 2, "Driver = " + libdir + "/libtdsodbc.so"); 
      lines.replace(lnbr + 3, "Setup = " + libdir + "/libtdsodbc.so"); 

      QString text; 
      for(int j = 0; j < lines.count(); j++) 
      { 
       text.append(lines[j] + "\n"); 
      } 

      odbcinst.open(QIODevice::WriteOnly | QIODevice::Text); 
      QTextStream updatefile(&odbcinst); 
      updatefile << text; 
      odbcinst.close(); 
     } 

    } 
#endif 

此代碼創建在.odbcinst.ini文件您的主目錄(如果它不存在)併爲FreeTDS添加條目。如果確實存在,它將追加到文件的末尾。如果文件中已存在FreeTDS條目,它將更新現有文件。下面是建立freetds的指導,如果您尚未:http://pzuk.wordpress.com/2012/02/03/how-to-make-freetds-unixodbc-and-qt-working-together/

注意,對於配置自己發佈,如果你想與您的應用程序捆綁freetds的,正確的有libary路徑設置只需要freetds的代碼你在哪裏發射。它以標準用戶身份運行,而不是以root身份運行,因此一切都在本地用戶帳戶中完成。

+0

請參閱我的下一個答案 –