質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.35%

C++ QT5でのMySQL外部接続

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,399

score 4

前提・実現したいこと

QT5を使用し、MySQLでライセンスの確認をする簡単なシステムを作っているのですが、
どうも仕組みがよく分かりません。

以前まではC#にてMysqlConnectorを使用してデータの取得や送信をしていたのですが、
諸事情でC++に移行することになり、UIにも優れているQT5を使用することにしました。
ところが、いざやってみると、どうも外部接続の際にもローカルのDBが必要なようで...
(ローカルのDBにも全くおなじ構成を創らないと、テーブルやカラムが存在しないとのエラー)

C#では、

connectionString = string.Format("Server={0};Database={1};Uid={2};Pwd={3}", SERVER, DB, USER, PWD);
connection = new MySqlConnection(connectionString);
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = String.Format("SELECT * FROM xxx_table WHERE raisensu='AAA'");
cmd.ExecuteNonQuery();


といった感じで詳細は省きますがローカルDB不要で取得できていましたので、とても混乱しています。
C++でMySQL外部接続は経験がございませんので、ご教授いただければ幸いです。

該当ソースコード

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSql>
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QMessageBox>
#include <string>
#include <QFile>
#include <QTextStream>
#include <QString>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

#define DATABASE_TYPE "QSQLITE"
#define DATABASE_NAME ""
#define HOST "AAA"
#define DATABASE "AAA"
#define USER "AAA"
#define PASSWORD "AAA"
#define PORT 3306

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public:
    QSqlDatabase createConnection(void);
    void closeConnection(QSqlDatabase);
    void SetStatus(QString msg);
    QString GetToken();
    bool CheckToken(QString token);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

QSqlDatabase db = QSqlDatabase::addDatabase(DATABASE_TYPE);

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QFile f(":qdarkstyle/style.qss");
    if (!f.exists())
    {
        printf("Unable to set stylesheet, file not found\n");
    }
    else
    {
        f.open(QFile::ReadOnly | QFile::Text);
        QTextStream ts(&f);
        qApp->setStyleSheet(ts.readAll());
    }
    createConnection();
    //Init();
}

QSqlDatabase MainWindow::createConnection(void)
{
    qDebug() << "Plugins loaded from: " << QCoreApplication::libraryPaths();
    db.addDatabase(DATABASE_TYPE, DATABASE_NAME);
    db.setHostName(HOST);
    //db.setDatabaseName(DATABASE);
    db.setUserName(USER);
    db.setPassword(PASSWORD);
    db.setPort(PORT);
    //db.setDatabaseName("C:/test.db");

    if (db.open()) {
        qDebug() << "Successfully connected to database!" << endl;
        ui->label_2->setStyleSheet("QLabel { color : green; }");
        SetStatus("準備完了");
        QSqlQuery query(db);
        //ローカルにDBを創らないとエラーが出るので、テーブルを作成してINSERTしています
        query.exec("create table key_list(id VARCHAR, raisensu text)");
        query.exec("insert into key_list (raisensu) values('VIP_36ED959D65165891B915E8B6E06E1A702AC29BCBBB4B2A85B94E10111BD10E75')");
        QMessageBox::information(this, "", query.lastError().text());
        return db;
    } else {
        qDebug() << "Database error occurred" << endl << "Not connected!" << endl;
        ui->label_2->setStyleSheet("QLabel { color : red; }");
        SetStatus("準備失敗");
        exit(1);
    }
}

//ライセンスがあっているか確認
bool MainWindow::CheckToken(QString token)
{
    QSqlQuery query(db);
    query.first();
    query.exec("SELECT * FROM key_list WHERE raisensu='"+token+"'");
    QString result;
    if(query.next())
    {
        QSqlRecord rec = query.record();
        result = query.value(rec.indexOf("raisensu")).toString();
        QMessageBox::information(this, "", result);
    }

    if(result == token)
    {
        ui->label_2->setStyleSheet("QLabel { color : green; }");
        SetStatus("認証成功!");
    }else{
        ui->label_2->setStyleSheet("QLabel { color : red; }");
        SetStatus("認証失敗");
        qDebug() << "" << query.lastError().text();
    }
}

void MainWindow::closeConnection(QSqlDatabase db)
{
    if(db.open()) {
        db.close();
    }
    db.~QSqlDatabase();
    return;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::SetStatus(QString msg)
{
    ui->label_2->setText(msg);
}

QString MainWindow::GetToken()
{
    QString text = ui->textEdit->toPlainText();
    return text;
}

void MainWindow::on_pushButton_clicked()
{
    if(GetToken() != nullptr)
    {
        CheckToken(GetToken());
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    //database.close();
    exit(0);
}

補足情報(FW/ツールのバージョンなど)

QT Creator
QT5
C++11

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

Qt でも、外部の MySQL サーバーに接続して利用することは可能です。
Qt のサンプルにデータベース接続のアプリケーションがあるので、それを参考にしてはいかがでしょう。

https://doc.qt.io/qt-5/qtsql-sqlbrowser-example.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

QSqlDatabaseは使った事がありませんが。

#define DATABASE_TYPE "QSQLITE"

QSqlDatabase::addDatabaseメソッドに渡すデータベースのドライバ名をここで定義していますが、SQLiteになっています。
MySQLを使いたければ、「QMYSQL」を指定する必要があります。

なお、ここに挙がっているドライバが全て使えるわけではないようです。
実際に使えるドライバは、QSqlDatabase::driversメソッドで調べる事ができます。
ちなみに、WindowsでのQtForPython(PySide2: PythonのQtモジュール)では、QMYSQLはありませんでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る