2017-02-10 137 views
1

我們在遠程Windows服務器上有一個Microsoft Sql 2014數據庫。我正在嘗試開發一個連接到這個數據庫的QT GUI應用程序。該應用程序在Linux/C++環境中。我嘗試使用QtSql API連接到該數據庫。如何從linux C++應用程序訪問SQL服務器?

bool MainWindow::connect() 
{ 
    QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");//I am not sure if I am calling this correctly 
    db.setHostName("III"); 

    db.setDatabaseName("YYY"); 
    db.setUserName("YYY"); 
    db.setPassword("XX"); 
    bool ok = db.open(); 
    if(ok==true) 
    { 
     QSqlQuery query; 
     query.exec("SELECT * FROM Subjects"); 
     while (query.next()) 
     { 
      int phy = query.value(0).toInt(); 
      int chem = query.value(1).toInt(); 
      ui->lineEdit_2->setText(QString::number(phy)); 
      ui->lineEdit_3->setText(QString::number(chem)); 
     } 
    } 
    else 
    { 
     qDebug()<<db.lastError(); 
    } 
    return ok; 
} 

它給我的錯誤是:

QSqlDatabase: QODBC driver not loaded 
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7 
QSqlError("", "Driver not loaded", "Driver not loaded") 

我試圖出口到我的Qt project.Still SQL驅動的路徑它沒有work.Then我讀過一些文章,我發現我需要mssql-tools以及我的Linux機器上的ODBC Driver。我試圖根據這個網站上安裝此:

https://blogs.msdn.microsoft.com/sqlnativeclient/2016/10/20/odbc-driver-13-0-for-linux-released/

,發現這不僅會在15.10 & 16.04在我的Linux機器(14.04 Ubuntu的),但工作。

The following packages have unmet dependencies: 
mssql-tools : 
      Depends: libc6 (>= 2.21) but 2.19-0ubuntu6.9 is to be installed 
      Depends: libstdc++6 (>= 5.2) but 4.8.4-2ubuntu1~14.04.3 is to be installed 
      Depends: msodbcsql (>= 13.1.0.0) but it is not going to be installed 
      Depends: msodbcsql (< 13.2.0.0) but it is not going to be installed 
E: Unable to correct problems, you have held broken packages. 

然後我用碼頭工人從這裏: https://hub.docker.com/r/taylorbarrick/mssql-server-linux-tools/

我能安裝成功,但是當我運行

$docker run -t taylorbarrick/mssql-server-linux-tools sqlcmd -d <dbname> -H <host> -U <username> -P <password> 

我再次收到錯誤。

Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired. 
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: Error code 0x2749. 
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.. 

但是,當使用可視化界面我可以連接到sql數據庫。請幫助。

回答

1

做你想做的事絕對有可能,但有點棘手。這裏是我的簡短指南(個人,我在unixodbcfreetds的幫助下解決了這個問題,它們工作正常,但也可以使用msodbc,總體思路是一樣的)。

首先,你得到的錯誤(QSqlDatabase: QODBC driver not loaded)意味着你沒有Qt的ODBC驅動程序。所以你必須從Qt源代碼構建它。運行MaintenanceTool以確保Qt版本的源代碼安裝在Qt的目錄中。然後仔細閱讀documentation關於構建SQL驅動程序和使用ODBC的詳細信息。你需要將該批次如下:

cd $QTDIR/qtbase/src/plugins/sqldrivers/odbc 
qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib -lodbc" 
make 

其次,在GNU/Linux環境,你需要unixodbctdsodbcfreetds-bin包(用於Debian傑西的名字,他們可能是在您的特定分佈不同)。我也建議你從這些軟件包中讀取MAN。 Freetds驅動程序必須「安裝」到unixodbc。下面的命令將做的工作(同樣,在Debian的傑西):

odbcinst -i -d -f /usr/share/tdsodbc/odbcinst.ini 

接下來,你應該提供正確連接字符串QSqlDatabase實例(通過調用QSqlDatabase::setDatabaseName)。另外,請確保數據庫的typeQODBC(您的代碼在此處是正確的)。您無法通過QSqlDatabase(即QSqlDatabase::setDatabaseName,QSqlDatabase::setPassword等無法正常工作)的常規呼叫來傳遞用戶名和密碼等。它們必須包含在應該看起來像這樣的連接字符串中:

DRIVER={freetds};SERVER=192.168.55.55;PORT=1433;DATABASE=YYY;UID=YYY;PWD=XX 

很明顯,你應該把正確的IP或主機名和其他參數。此外,freetds必須替換爲正確的驅動程序名稱(它存儲在unixodbc配置文件中)。有一個方便的生成連接字符串的site。還有一個在MSDN上的connection string format的參考。

最後,MS SQL Server和您的數據庫實例必須正確配置。確保MS SQL Server接受TCP連接並綁定到正確的端口(和地址!)。另外,您應該爲SQL Server和DB實例設置正確的「身份驗證模式」:默認情況下,它僅爲「Windows身份驗證」,但要通過freetds進行連接,則必須允許「SQL Server身份驗證」。

也許別的東西需要調整。仔細閱讀文檔和日誌。

加了:我剛剛讀過MS提供的驅動。整個過程相同,但是您應該使用此MS驅動程序(即通過odbcinst將其「安裝」到unxiodbc中或手動進入配置並將正確的驅動程序名稱和其他參數放入連接字符串中),而不是freetds。無論如何,ODBC的Qt驅動程序包裝在unixodbc左右,所以無法避免。

+0

還要確保QODBC驅動程序('.so'文件)存儲在'$ QTDIR/5.6/gcc_64/plugins/sqldrivers /'和'unixodbc-dev'軟件包中的某處必須安裝以構建驅動程序! –

+1

非常感謝您提供解決方案並解釋得非常好。但是,我使用外部數據包裝器(Foreign Data Wrapper)概念解決了這個問題,因此使我的postgres數據庫能夠訪問SQL數據庫的「視圖」。我不必在postgres客戶端安裝任何東西,但只能在服務器端安裝。正因爲如此,我的QT應用程序現在不需要改變。對於我的應用程序,它定期調用postgress db.This運作完美。但我接受你的答案。 – Minion

0

要使用MSSql服務器,您可能必須安裝Microsoft的ODBC版本(msodbc),而不是unixodbc,因爲... Microsoft。您可以在https://www.microsoft.com/en-us/sql-server/sql-server-vnext-including-Linux下載它。

一旦你有了,你可以通過ODBC訪問MSSql數據庫。這是錯誤的,每當它更新時,它可能會失敗,所以你必須刪除並重新安裝庫和開發包。

+0

我試過這個,我一直卡在最後。我認爲它主要是因爲我不能在Ubuntu 14.04中安裝一些東西,但只安裝了16.04。 – Minion

+0

啊,你正在使用LTS。別。對最終用戶來說很好,但對開發機器來說卻沒用。 MSSql for Linux僅在去年推出,所以它的要求不會在LTS版本中得到滿足。升級並再試一次 - 當我試圖堅持14.04時,我又有了這次和timg。 – Mike

相關問題