QT の mysql (データベース) のベスト プラクティスと FAQ

データベースに関して言えば、まずアムウェイには Navicat Premium というソフトウェアがあり、データベースをクエリするのに非常に便利です。 

QMysql ドライバーは、Qt SQL モジュールが MySQL データベースと通信するために使用するプラグインです。QMysql ドライバーをコンパイルするには、次の条件を満たす必要があります。

QT の Qmysql の現在のバージョンはインストール中にインストールされないため、この DLL ファイルを自分でコンパイルする必要があります。

QMysql の関連 DLL ファイルをコンパイルする手順は次のとおりです。

  • Qt コマンド プロンプトを開き、Qt ソース コード ディレクトリの qt/src/plugins/sqldrivers/mysql フォルダーを入力します。次に例を示します。
F:\QT\5.12.9\Src\qtbase\src\plugins\sqldrivers\mysql

次に、次のコード行をコメント アウトし、次に示すように mysql のアドレスを構成します。

コピー

  • MySQL ヘッダー ファイルとライブラリ ファイルのパスを指定して、qmake コマンドを実行します。例:

INCLUDEPATH += "E:/mysql/mysql-5.7.27-winx64/include"
DEPENDPATH += "E:/mysql/mysql-5.7.27-winx64/include"
LIBS += "E:/mysql/mysql-5.7.27-winx64/lib/libmysql.lib"
DESTDIR = ../mysql/mylib

コピー

  • make または mingw32-make コマンドを実行し、コンパイラの種類に応じて適切なコマンドを選択します (VS 環境で SQL を使用する場合は、VS コンパイラでコンパイルするだけで済みます)。次に例を示します。
mingw32-make

コピー

  • コンパイルが成功すると、現在のディレクトリに qsqlmysql.dll という名前のファイルが表示されます。これが QMysql プラグインです。このファイルを、Qt アプリケーションを実行する Qt ディレクトリの下の qt/plugins/sqldrivers フォルダーにコピーする必要があります。次に例を示します。
F:\QT\5.12.9\msvc2017_64\plugins\sqldrivers

以上が準備作業です。

次に、QT で Qmysql 関数を使用する方法ですが、まずヘッダー ファイルをインポートする必要があります。ファイルは次のとおりです。

#include <QtSql/QSqlDatabase>	// 连接数据库
#include <QtSql/QSqlError>		// 数据库连接失败打印报错语句
#include <QtSql/QSqlQuery>		// 数据库操作(增删改查)
#include <QSqlQueryModel>

cpp ファイルに書き込む関数名を定義しました。

 Q_OBJECT
public:
    mysql(QWidget *parent);
    ~mysql();
    void insert(QString InserName,int id,QString symbol,QString value);
    void insert_line(QString InserName,QString id,QString symbol,QString value,QString v,QString despoitory);

    void data_connect(bool,bool);//连接数据库
    void data_test_connect(QStringList);//测试能否成功连接数据库
    void close_data();
    void creat_table(QString TableName);//创建一个表
    void update_table(QString InserName,QString id,QString key,QString value);//更新数据库
    void delete_table(QString TableName,QString id);//删除数据库
    void find_alltable(QString datebase);//查找所有数据路表格
    void find_table_inf(QString TableName);//查询某个表中的数据
    void find_table_row(QString TableName,QString row_name,QString col_name);//查询表中某一行的数据
    void find_table_col(QString TableName,QString col_name);//表名,列名
    void find_table_desposite(QString TableName,QString col_name);//表名,列名查询储位名

対応する関数名において、実装される関数は以下のとおりです。

1 つ目は、関数のデータベース部分に接続することです。

QSettings *myini=new QSettings("info.ini", QSettings::IniFormat);//构造QSettings对象,访问ini文件
        QStringList info_digitial={"digitial_type","hostname","port","database_name","user_name","password"};
        QStringList s;
        //设置键值对
        s.clear();
        myini->beginGroup("digital");
        for(int i=0;i<info_digitial.size();i++)
        {
           s.append(myini->value(info_digitial[i]).toString());
        }
        myini->endGroup();
        delete myini;
    //输出可用数据库
        qDebug()<<"available drivers:";
        QStringList drivers = QSqlDatabase::drivers();
        foreach(QString driver, drivers)
        qDebug()<<driver;//输出中含有MySQL,那么恭喜你说明你的qt有MySQL驱动了

        QSqlDatabase db = QSqlDatabase::addDatabase(s[0]);
        db.setHostName(s[1]);
        db.setPort(s[2].toInt());
        db.setDatabaseName(s[3]);//数据库名
        db.setUserName(s[4]);//用户名
        db.setPassword(s[5]);//密码
        bool ok = db.open();//打开并连接数据库
        if(message_prompt)
        {
            if (ok){
                QMessageBox::information(this, "infor", "success connect");
            }
            else {
                QMessageBox::information(this, "infor", "open failed");
                qDebug()<<"error open database because"<<db.lastError().text();
            }
        }

ここでは、ini ファイルに保存されている情報を読み取ることでデータベース設定を取得します。主に次の情報が含まれます。 

QSqlDatabase オブジェクト データベースを定義し、インスタンス化します。接続に成功するとブール値が返されます。ここでは、このブール値を使用してデータベースに正常に接続されたかどうかを判断します。

次に、データベースにテーブルを作成し、そこに値を挿入します。


    QSqlQuery query;
    QString sql=QString("create table %1(订单号 text, 料号 text, 品名 text, 数量 text,储位 text);").arg(TableName);//"订单号","料号","品名","数量"
    qDebug()<<"SQL"<<sql;

    //创建表是否成功

    if (!query.exec(sql))//.exec(),作用是开启一个循环,执行一个事件,相当于while(1)

    {
        qDebug() << QString::fromLocal8Bit("creat table failed:") << query.lastError();

    }

    else

    {
        qDebug() << QString::fromLocal8Bit("creat table success!");

    }

テーブル table にデータを挿入する機能は次のように実装されます。

 QSqlQuery query;
       QString str=QString("insert into %4(序号,标签,value) values(%1,'%2','%3')").arg(id).arg(symbol).arg(value).arg(InserName);
       if(query.exec(str)==false)
       {
            qDebug() << "insert failed";
            QMessageBox::warning(this,u8"数据插入错误",u8"请检查数据是否正确");
       }
       else
       {
           QMessageBox::information(this, "insert", "insert connect");
            qDebug() <<"insert success";
       }

データを更新する機能を実現しており、コード部分は以下の通りです。

    QSqlQuery query;
    QString updata = QString("update %1 set  %2='%3' where 订单号='%4'").arg(InserName).arg(column).arg(value).arg(row);
    qDebug()<<"--update--"<<updata;
    if (!query.exec(updata))
    {
        qDebug() << QString::fromLocal8Bit("updata failed!") << query.lastError();
    }
    else
    {
        qDebug() << QString::fromLocal8Bit("updata success!");
    }

先ほどデータベーステーブルの作成とデータ挿入機能の実装について説明しましたが、次にデータベースの削除機能について説明します。コード部分は次のとおりです。

     QSqlQuery query;
     QString sql = QString("delete from %1 where  订单号 = '%2'").arg(TableName).arg(id);
     if(query.exec(sql))
     {
         qDebug()<<"delete success!";
     }
     else
     {
         qDebug()<<"delete failed!";
     }

おすすめ

転載: blog.csdn.net/Helloorld_1/article/details/132297907