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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

2回答

1788閲覧

C++ QT5でのMySQL外部接続

dragonball

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2019/08/26 05:59

前提・実現したいこと

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

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

C#では、

C#

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

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

該当ソースコード

mainwindow.h

C++

1#ifndef MAINWINDOW_H 2#define MAINWINDOW_H 3 4#include <QMainWindow> 5#include <QtSql> 6#include <QtSql/QSql> 7#include <QtSql/QSqlDatabase> 8#include <QMessageBox> 9#include <string> 10#include <QFile> 11#include <QTextStream> 12#include <QString> 13#include <QSqlQuery> 14#include <QSqlError> 15#include <QDebug> 16 17#define DATABASE_TYPE "QSQLITE" 18#define DATABASE_NAME "" 19#define HOST "AAA" 20#define DATABASE "AAA" 21#define USER "AAA" 22#define PASSWORD "AAA" 23#define PORT 3306 24 25namespace Ui { 26class MainWindow; 27} 28 29class MainWindow : public QMainWindow 30{ 31 Q_OBJECT 32 33public: 34 explicit MainWindow(QWidget *parent = nullptr); 35 ~MainWindow(); 36 37public: 38 QSqlDatabase createConnection(void); 39 void closeConnection(QSqlDatabase); 40 void SetStatus(QString msg); 41 QString GetToken(); 42 bool CheckToken(QString token); 43 44private slots: 45 void on_pushButton_clicked(); 46 47 void on_pushButton_2_clicked(); 48 49private: 50 Ui::MainWindow *ui; 51}; 52 53#endif // MAINWINDOW_H 54

mainwindow.cpp

C++

1#include "mainwindow.h" 2#include "ui_mainwindow.h" 3 4QSqlDatabase db = QSqlDatabase::addDatabase(DATABASE_TYPE); 5 6MainWindow::MainWindow(QWidget *parent) : 7 QMainWindow(parent), 8 ui(new Ui::MainWindow) 9{ 10 ui->setupUi(this); 11 12 QFile f(":qdarkstyle/style.qss"); 13 if (!f.exists()) 14 { 15 printf("Unable to set stylesheet, file not found\n"); 16 } 17 else 18 { 19 f.open(QFile::ReadOnly | QFile::Text); 20 QTextStream ts(&f); 21 qApp->setStyleSheet(ts.readAll()); 22 } 23 createConnection(); 24 //Init(); 25} 26 27QSqlDatabase MainWindow::createConnection(void) 28{ 29 qDebug() << "Plugins loaded from: " << QCoreApplication::libraryPaths(); 30 db.addDatabase(DATABASE_TYPE, DATABASE_NAME); 31 db.setHostName(HOST); 32 //db.setDatabaseName(DATABASE); 33 db.setUserName(USER); 34 db.setPassword(PASSWORD); 35 db.setPort(PORT); 36 //db.setDatabaseName("C:/test.db"); 37 38 if (db.open()) { 39 qDebug() << "Successfully connected to database!" << endl; 40 ui->label_2->setStyleSheet("QLabel { color : green; }"); 41 SetStatus("準備完了"); 42 QSqlQuery query(db); 43 //ローカルにDBを創らないとエラーが出るので、テーブルを作成してINSERTしています 44 query.exec("create table key_list(id VARCHAR, raisensu text)"); 45 query.exec("insert into key_list (raisensu) values('VIP_36ED959D65165891B915E8B6E06E1A702AC29BCBBB4B2A85B94E10111BD10E75')"); 46 QMessageBox::information(this, "", query.lastError().text()); 47 return db; 48 } else { 49 qDebug() << "Database error occurred" << endl << "Not connected!" << endl; 50 ui->label_2->setStyleSheet("QLabel { color : red; }"); 51 SetStatus("準備失敗"); 52 exit(1); 53 } 54} 55 56//ライセンスがあっているか確認 57bool MainWindow::CheckToken(QString token) 58{ 59 QSqlQuery query(db); 60 query.first(); 61 query.exec("SELECT * FROM key_list WHERE raisensu='"+token+"'"); 62 QString result; 63 if(query.next()) 64 { 65 QSqlRecord rec = query.record(); 66 result = query.value(rec.indexOf("raisensu")).toString(); 67 QMessageBox::information(this, "", result); 68 } 69 70 if(result == token) 71 { 72 ui->label_2->setStyleSheet("QLabel { color : green; }"); 73 SetStatus("認証成功!"); 74 }else{ 75 ui->label_2->setStyleSheet("QLabel { color : red; }"); 76 SetStatus("認証失敗"); 77 qDebug() << "" << query.lastError().text(); 78 } 79} 80 81void MainWindow::closeConnection(QSqlDatabase db) 82{ 83 if(db.open()) { 84 db.close(); 85 } 86 db.~QSqlDatabase(); 87 return; 88} 89 90MainWindow::~MainWindow() 91{ 92 delete ui; 93} 94 95void MainWindow::SetStatus(QString msg) 96{ 97 ui->label_2->setText(msg); 98} 99 100QString MainWindow::GetToken() 101{ 102 QString text = ui->textEdit->toPlainText(); 103 return text; 104} 105 106void MainWindow::on_pushButton_clicked() 107{ 108 if(GetToken() != nullptr) 109 { 110 CheckToken(GetToken()); 111 } 112} 113 114void MainWindow::on_pushButton_2_clicked() 115{ 116 //database.close(); 117 exit(0); 118}

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

QT Creator
QT5
C++11

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

c++

1#define DATABASE_TYPE "QSQLITE"

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

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

投稿2019/08/26 11:16

katsuko

総合スコア3469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2019/08/26 06:32

tasuku.

総合スコア347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問