2017-02-10 11 views
1

リモートWindowsサーバー上にMicrosoft SQL 2014データベースがあります。私はこのデータベースに接続するQT GUIアプリケーションを開発しようとしています。このアプリはLinux/C++環境にあります。 QtSql APIを使用してそのデータベースに接続しようとしました。私はそれが私はいくつかの記事を読んで、私は必要なことがわかっwork.Thenていなかった私のQt project.StillへのSQLドライバのパスを輸出しようとしたlinuxのC++アプリケーションからSQLサーバーにアクセスする方法は?

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

:として

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; 
} 
私にエラーを与えて

その私のLinuxマシン上のmssql-toolsとODBCドライバ。

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

と、これは私のLinuxボックス(14.04 Ubuntuの)だけ15.10 & 16.04上では動作しないことが見つかりました:私はこのウェブサイトに基づいてこれをインストールしてみました。

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のディレクトリにインストールされていることを確認してください。次に、SQLドライバの構築と使用法ODBCの詳細について、慎重にdocumentationを読んでください。あなたが必要とするバッチは以下の通りです:

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

は第二に、GNU/Linux環境で使用するには(Debianのジェシーの名前は、彼らはあなたの特定のディストリビューションでは異なる場合があります)unixodbctdsodbcfreetds-binパッケージが必要です。これらのパッケージからMANを読むことをお勧めします。 Freetdsドライバはunixodbcに "インストール"する必要があります。コマンドは(Debianのジェシーに、再び)仕事をする次のとおりです。

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

次は、(QSqlDatabase::setDatabaseNameコール経由)QSqlDatabaseにインスタンス正しい接続文字列を提供する必要があります。また、データベースのtypeQODBCであることを確認してください(この時点で正しいコードです)。 QSqlDatabaseという定期的な呼び出し(つまり、QSqlDatabase::setDatabaseNameQSqlDatabase::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とインスタンスのDBを正しく構成する必要があります。 MS SQL ServerがTCP接続を受け入れ、正しいポート(およびアドレス)にバインドされていることを確認してください。また、SQL ServerとDBインスタンスの両方に対して正しい「認証モード」を設定する必要があります。デフォルトでは「Windows認証のみ」ですが、freetdsで接続するには「SQL Server認証」を許可する必要があります。

多分、他の何かを調整する必要があります。ドキュメントとログを慎重に読んでください。

追加:私はMSから提供されたドライバについて読みました。全体のプロセスは同じですが、freetdsの代わりに、odbcinst経由でunxiodbcに「インストール」するか、手動で設定し、正しいドライバ名とその他のパラメータを接続文字列に入れてください)。とにかく、ODBC用のQtドライバはunixodbcをラップするので、回避することはできません。

+0

ドライバをビルドするには、 '$ QTDIR/5.6/gcc_64/plugins/sqldrivers /'と 'unixodbc-dev'パッケージのどこかに保存されているQODBCドライバ(' .so'ファイル)もインストールされていることを確認してください! –

+1

解決策を提供してくれてありがとう、ありがとうございました。しかし、私はForeign Data Wrapperの概念を使用してそれを解決しました。それによって、私のpostgresデータベースがSQLデータベースの "ビュー"にアクセスできるようになりました。私はpostgresのクライアント側には何もインストールする必要はありませんでしたが、サーバ側にしかインストールしませんでした。このため、私のQTアプリは今変更する必要はありません。私のアプリケーションでは、そのポストのdb.Thisへの定期的な呼び出しは完全に働いた。しかし、私はあなたの答えを受け入れています。 – Minion

0

MSSqlサーバーを使用するには、unixodbcではなくMicrosoftのODBC(msodbc)バージョンをインストールする必要があります。 https://www.microsoft.com/en-us/sql-server/sql-server-vnext-including-Linuxからダウンロードできます。

これを取得したら、ODBC経由でMSSqlデータベースにアクセスできます。それはバグであり、更新するたびに失敗して、ライブラリとdevパッケージの両方を削除して再インストールする必要があります。

+0

私はこれを試しました。私は最後に立ち往生し続けます。主に私はUbuntu 14.04にいくつかのものをインストールすることはできないが、たった16.04しかインストールできないと思う。 – Minion

+0

ああ、あなたはLTSを使っています。しないでください。エンドユーザーにとっては大丈夫ですが、開発マシンにとっては無用です。 Linux用のMSSqlは昨年発売されただけなので、その要件はLTSリリースでは満たされません。アップグレードしてもう一度やり直してください - 14.04に固執しようとしたとき、私はこの時間と時間をもう一度持っていました。 – Mike

関連する問題