刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

UbuntuでQt5からSQLServer2019に接続する

前回の続きです。

unixODBC と MicrosoftODBCドライバでの接続が確認できたので、次は Qt5 からアクセスしてみます。

ちなみに、Qt5 の SQLServer 用データベースドライバは QODBC ですが、UnixmacOS 環境の QODBC には unixODBC のヘッダとライブラリが利用されているため、事前に unixODBC 単体で接続確認をした次第です。

1. 環境

  • Ubuntu Desktop 18.04.4 LTS 日本語Remix (Linux Kernel 5.3.0-28-generic)
  • SQL Server 2019 (RTM-CU1) (KB4527376) - 15.0.4003.23 (X64) on Linux
  • mssql-tools unixodbc-dev パッケージは導入済み
  • 評価用のデータベースを NorthwindJ にしていますが、各々の環境に置き換えてください。

2. Qt5 環境の準備

LTS 版は Qt 5.12.4 ですが、最新版を試したくなり、Qt 5.14.1 の環境を準備しました。

  • Qt 5.14.1 (open source 版)
  • Qt Creator 4.11 (Qt 5.14.1 同梱)
  • gcc 7.4.0

※ Qt5 のインストール手順については言及しません。

3. Qt コンソールアプリケーション での評価

(1) プロジェクトの準備

SQLServer 上のデータベース NorthwindJ に接続して、クエリを実行結果を表示するプロジェクト mssqltest を作成します。

  1. Qt Creator を起動
  2. 「ファイル」-「ファイル/プロジェクトの新規作成」を選択
  3. プロジェクト「アプリケーション」の「Qt コンソールアプリケーション」を選択し、[ 選択 ] ボタンをクリック
  4. [ プロジェクトパス ] で、名前に mssqltest と入力し、パスは任意の場所を設定して [ 次へ ] ボタンをクリック
  5. [ ビルドシステムの定義 ] で、そのまま [ 次へ ] ボタンをクリック
  6. [ Translation File ] で、そのまま [ 次へ ] ボタンをクリック
  7. [ キットの選択 ] で、そのまま [ 次へ ] ボタンをクリック
  8. [ プロジェクト管理 ] で、そのまま [ 完了 ] ボタンをクリック

自動的にプロジェクトが生成され、main.cpp の編集画面になります。

(2) プロジェクト編集

まず、mssqltest.pro の編集です。プロジェクトにQT += sqlを追記します。

    QT -= qui
    QT += sql

次に main.cpp を編集します。

#include <QCoreApplication>
#include <QDebug>
#include <QDate>
#include <QtSql>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
    db.setDatabaseName("Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=NorthwindJ;UID=sa;PWD=abcd1234$");
    if (db.open()) {
        QSqlQuery qry(db);
        qry.exec("SELECT [氏名],[フリガナ],[誕生日] FROM [社員]");
        qDebug() << "実行したクエリ = " << qry.executedQuery() << "\n";
        qDebug() << qPrintable(qry.record().fieldName(0)) << "\t\t"
                 << qPrintable(qry.record().fieldName(1)) << "\t\t"
                 << qPrintable(qry.record().fieldName(2));
        qDebug() << qPrintable(QString("-").repeated(60));
        int row_count = 0;
        while (qry.next()) {
            qDebug() << qPrintable(qry.value(0).toString()) << "\t"
                     << qPrintable(qry.value(1).toString()) << "\t"
                     << qPrintable(qry.value(2).toDate().toString("yyyy/MM/dd"));
            row_count++;
        }
        qDebug() << qPrintable(QString("-").repeated(60));
        qDebug() << qPrintable(QString::number(row_count)) << "rows";
        db.close();
    } else {
        qDebug() << "接続エラー = " << db.lastError().text();
    }
    //return a.exec();
    return 0;
}

上の例では Connection String を記述して、DSN-less で接続しています。
DSN を指定する場合、次のように変更してください。

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3", "NorthwindJ");
    db.setDatabaseName("NorthwindJ");
    db.setUserName("sa");
    db.setPassword("abcd1234$");

編集が終わったら、「ファイル」-「すべて保存」を選択します。

(3) ビルドと実行

試すだけなので、Qt Creator の「ファイル」-「実行」を選択します。

正常にビルドが終了すると、プロジェクトが起動して、次のように表示されます。

f:id:infinity_volts:20200203125511p:plain

これで、Qt 5.14 から unixODBC と MS 版 ODBC ドライバ を経由して、SQLServer への接続が確認できました。

4. 補足

前述のプロジェクトは5・6年前に試したコードを少し修正したものなので、現状の推奨される書き方と異なるかもしれません。

後でデータベースの扱いについて調べたら、とても参考になる記事がありましたので、こちらをお勧めします。

Qt5 はマルチプラットホームな開発環境なので、LinuxmacOS でお世話になってます。公式サンプルも色々試せるので、とても勉強になります。

なお、公式サンプルの SQL Browser を試したら、変更を加える事なく動作しました。
Connection String 指定と DSN 指定どちらも問題ないです。

f:id:infinity_volts:20200203132401p:plain

接続ダイアログが表示されたら、入力項目「Database Name: 」に接続文字列を入力して、他の入力項目は未入力のまま [ OK ] ボタンをクリックすれば DSN 指定のように接続されます。