精华内容
下载资源
问答
  • 后来又认真看了一下QT助手资料,写一数据库连接的详细用法。不多说,看以下代码就明白了。 QString connect = "connectname"; //自定义的连接名称 { //这个括号一定要有,这样可以把QSqlDatabase约束在一个指定的...

    从网上查了很多资料,大多只是简单的说一下,没有详细的说明。后来又认真看了一下QT助手资料,写一数据库连接的详细用法。不多说,看以下代码就明白了。 

    QString connect = "connectname"; //自定义的连接名称
    
    {    //这个括号一定要有,这样可以把QSqlDatabase约束在一个指定的作用域范围内
    
    	QSqlDatabase data;
    	initDateBase(data, connect);
    	const QString time = PatternImgMs::getTimeString();
    	const QString str = sqlstring;  //自定义的SQL处理
    		
    	QSqlQuery query(data);
    
    	if (!query.exec(str))
    	{
    			qDebug() << "Error: Fail to insert data. ";
    	}
    
    	data.close();
    }
    //在作用域范围外再删除以这个名称命名的数据库连接
    QSqlDatabase::removeDatabase(connect);
    
    
    
    void initDateBase(QSqlDatabase& data, QString& connectName)
    {
    	if (QSqlDatabase::contains(connectName))
    	{
    		///不允许创建两个相同名字的连接,所以首先判断是否存在相同的连接
    		data = QSqlDatabase::database(connectName);
    	}
    	else
    	{
    		///创建新的连接
    		data = QSqlDatabase::addDatabase("QSQLITE", connectName);
    		data.setDatabaseName("database.db");
    
    		if (!data.open())
    		{
    			//QMessageBox::critical(nullptr, "错误", "数据库连接错误!");
    			exit(0);
    		}
    	}
    }

     

    展开全文
  • QT数据库操作

    2013-01-06 16:49:50
    本人在做项目里用到的数据库操作,对于用QT项目的服务器。
  • QT 简单的MySQL数据库使用例子 一、简述 记--简单的使用MySQL数据库的编程例子。 例子:链接: https://pan.baidu.com/s/1fkJXhyYzyDghx7ciOUcUtA&shfl=shareset 提取码: d7ap 二、...

                                                  QT 简单的MySQL数据库使用例子

    一、简述

             记--简单的使用MySQL数据库的编程例子。

             例子:链接: https://pan.baidu.com/s/1fkJXhyYzyDghx7ciOUcUtA&shfl=shareset 提取码: d7ap

    二、效果

               

     

    三、工程结构

    相关软件版本:

    四、源文件

            main.cpp文件        

    #include "mainwindow.h"
    #include "logindialog.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        MainWindow *main = new MainWindow();
    
        LoginDialog login;
        if (login.exec() == QDialog::Accepted)//调用login.exec(),阻塞主控制流,直到完成返回,继续执行主控制流
        {
           main->loadData();
           main->show();
           return a.exec();
        }
        return 0;
    }
    

    adddialog.h文件

    #ifndef ADDDIALOG_H
    #define ADDDIALOG_H
    
    #include <QDialog>
    #include <QIntValidator>
    
    #ifndef STUDENTSTRUCT
    //自定义信息结构体
    struct StudentInfo
    {
        int id;
        QString name;
    };
    #define STUDENTSTRUCT
    #endif
    
    namespace Ui {
    class AddDialog;
    }
    
    class AddDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit AddDialog(QWidget *parent = 0);
        ~AddDialog();
    
    signals:
        void sig_addData(StudentInfo info);
    
    private slots:
        void on_pushButtonAdd_clicked();
        void on_pushButtonReturn_clicked();
    
    private:
        Ui::AddDialog *ui;
        QIntValidator* mIntValidator;
    };
    
    #endif // ADDDIALOG_H
    

    adddialog.cpp文件

    #include "adddialog.h"
    #include "ui_adddialog.h"
    #include <QMessageBox>
    #include <QDebug>
    
    AddDialog::AddDialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::AddDialog)
    {
        ui->setupUi(this);
        //去掉问号按钮
        Qt::WindowFlags flags= this->windowFlags();
        setWindowFlags(flags&~Qt::WindowContextHelpButtonHint);
    
        //设置ID范围
        mIntValidator = new QIntValidator(1, 65535, this);
        ui->lineEditID->setValidator(mIntValidator);
    }
    
    AddDialog::~AddDialog()
    {
        delete ui;
    }
    
    //添加数据
    void AddDialog::on_pushButtonAdd_clicked()
    {
        StudentInfo info;
        QString sid = ui->lineEditID->text();
        QString name = ui->lineEditName->text();
        if(sid.isEmpty() || name.isEmpty())
        {
            QMessageBox::information(this, "提示", "ID和姓名不能为空");
            return;
        }
    
        info.id = sid.toInt();
        info.name = name;
    
        //将数据发送主界面
        emit sig_addData(info);
    
        //accept();//关闭窗体,并设置返回值为Accepted
    }
    
    //取消
    void AddDialog::on_pushButtonReturn_clicked()
    {
        this->close();
    }
    

     logindialog.h文件

    #ifndef LOGINDIALOG_H
    #define LOGINDIALOG_H
    
    #include <QDialog>
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QIntValidator>
    
    namespace Ui {
    class LoginDialog;
    }
    
    class LoginDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit LoginDialog(QWidget *parent = 0);
        ~LoginDialog();
        bool connDataBase(QSqlDatabase& db, QString dataBaseName, QString userName, QString Pass, QString hostName = "127.0.0.1", QString port = "3306", QString sqlType = "QMYSQL");
        void setSqlDatabase(QSqlDatabase& db);
    
    private slots:
        void on_pushButtonLogin_clicked();
    
        void on_pushButtonExit_clicked();
    
        void on_pushButtonInit_clicked();
    
    private:
        Ui::LoginDialog *ui;
        QSqlDatabase mDb;
        QIntValidator* mIntValidator;
    };
    
    #endif // LOGINDIALOG_H
    

    logindialog.cpp文件

    #include "logindialog.h"
    #include "ui_logindialog.h"
    #include <QIntValidator>
    #include <QMessageBox>
    #include <QSqlError>
    #include <QDebug>
    
    QSqlDatabase gDb;//多窗体共用对象
    
    LoginDialog::LoginDialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::LoginDialog)
    {
        ui->setupUi(this);
    
        //设置窗体标题
        this->setWindowTitle("登录");
    
        //去掉问号按钮
        Qt::WindowFlags flags= this->windowFlags();
        setWindowFlags(flags&~Qt::WindowContextHelpButtonHint);
    
        //设置端口范围
        mIntValidator = new QIntValidator(1, 65535, this);
        ui->lineEditPort->setValidator(mIntValidator);
    
        //填充comboBox 数据库类型
        QStringList drivers = QSqlDatabase::drivers();
        if(drivers.size()>0)
        {
            ui->comboBoxSqlType->addItems(drivers);
        }
        else
        {
            ui->comboBoxSqlType->addItem("None");
            ui->pushButtonInit->setVisible(false);
            ui->pushButtonLogin->setVisible(false);
        }
    }
    
    LoginDialog::~LoginDialog()
    {
        delete ui;
    }
    
    /* 登录
     *
     */
    void LoginDialog::on_pushButtonLogin_clicked()
    {
    
        QString sqlType = ui->comboBoxSqlType->currentText();
        if(sqlType.isEmpty() || sqlType == "None")
        {
            QMessageBox::information(this, "提示", "请安装数据库!");
            return;
        }
    
        QString hostName = ui->lineEditHostName->text();
        QString port = ui->lineEditPort->text();
        QString dataBaseName = ui->lineEditDatabaseName->text();
        QString userName = ui->lineEditUserName->text();
        QString pwd = ui->lineEditPass->text();
    
        if(hostName.isEmpty() || port.isEmpty() || dataBaseName.isEmpty() || userName.isEmpty())
        {
            return;
        }
    
        bool ok = connDataBase(mDb, dataBaseName, userName, pwd, hostName, port, sqlType);
        if(ok)
        {
            gDb = mDb;
            accept();//关闭窗体,并设置返回值为Accepted
        }
        else
        {
            QMessageBox::information(this, "提示", "连接失败!");
            //qDebug()<<mDb.lastError().number();
        }
    
    }
    
    /* 连接数据库
     *
     */
    bool LoginDialog::connDataBase(QSqlDatabase& db, QString dataBaseName, QString userName, QString Pass,QString hostName, QString port, QString sqlType)
    {
        if(db.isDriverAvailable(sqlType))
        {
            if(QSqlDatabase::contains("qt_sql_default_connection"))
            {
                db = QSqlDatabase::database("qt_sql_default_connection");
            }
            else
            {
                db = QSqlDatabase::addDatabase(sqlType);
            }
    
            db.setHostName(hostName);
            db.setPort(port.toInt());
            db.setDatabaseName(dataBaseName);
            db.setUserName(userName);
            db.setPassword(Pass);
    
            if(db.open())
            {
                return true;
            }
            db.close();
            db.removeDatabase(sqlType);
        }
    
        return false;
    }
    
    //退出
    void LoginDialog::on_pushButtonExit_clicked()
    {
        this->close();
    }
    
    //用于第一次创建数据库和表
    void LoginDialog::on_pushButtonInit_clicked()
    {
        //先使用自带的数据库mysql进行初始化(安装好MySQL数据库就存在的)
        QSqlDatabase myDb;
        if(QSqlDatabase::contains("qt_sql_default_connection"))
        {
            myDb = QSqlDatabase::database("qt_sql_default_connection");
        }
        else
        {
            myDb = QSqlDatabase::addDatabase("QMYSQL");
        }
    
        myDb.setHostName("127.0.0.1");
        myDb.setPort(3306);
        myDb.setDatabaseName("mysql");
        myDb.setUserName("root");
        myDb.setPassword("123456");
        if(!myDb.open())
        {
            return;
        }
    
        QSqlQuery sqlQuery(myDb);
    
        //创建数据库
        sqlQuery.exec("create database if not exists Mydatabase");
    
        //指定当前使用的数据库
        sqlQuery.exec("use Mydatabase");
    
        //创建表
        sqlQuery.exec("create table Student(id int(9) not null primary key,name varchar(10) not null);");
    
        //插入2条数据
        sqlQuery.exec("insert into Student values (1001,'liang'),(1002,'lisi')");
    
        myDb.close();
        QMessageBox::information(this, "提示", "数据库:Mydatabase\n 表:Student\n创建完成!");
    
    }
    

     mainwindow.h

    文件

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QSqlDatabase>
    #include <QStandardItemModel>
    #include "adddialog.h"
    #include "modifydialog.h"
    #include <QSqlQuery>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        int loadData();
    
    private slots:
        void on_pushButtonAdd_clicked();
        void slot_addData(StudentInfo info);
        void slot_showMenu(QPoint);
        void slot_delData(bool b);
        void on_actionAbout_triggered();
        void slot_modifyData(StudentInfo info);
        void slot_showAddDlg(bool b);
        void slot_modifyDataByDoubleClick(QModelIndex modelIndex);
    
    private:
        Ui::MainWindow *ui;
        QStandardItemModel* mStdItemModel;//表头
        AddDialog* mAddDlg;//添加对话框
        ModifyDialog* mMdfDlg;//修改对话框
        QMenu* mMenu;//右键菜单
        QAction* mDelAction;//菜单删除动作
        QAction* mAddAction;//菜单添加动作
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp文件

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QDebug>
    #include <QMessageBox>
    #include <QSqlError>
    
    //要操作的数据库表
    #define TABLENAME "Student"
    
    extern QSqlDatabase gDb;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        //注册自定义数据类型(作为信号参数)
        qRegisterMetaType<StudentInfo>("StudentInfo");
    
        //设置窗体标题
        this->setWindowTitle("主界面");
    
        //屏蔽最大化按钮
        Qt::WindowFlags flags= this->windowFlags();
        setWindowFlags(flags&~Qt::WindowMaximizeButtonHint);
    
        //固定窗体大小
        this->setFixedSize(this->width(), this->height()-23);
    
        //创建表头
        mStdItemModel = new QStandardItemModel();
        //添加两列
        mStdItemModel->setColumnCount(2);
        mStdItemModel->setHeaderData(0,Qt::Horizontal,"ID");
        mStdItemModel->setHeaderData(1,Qt::Horizontal,"姓名");
    
        //设置到tableView控件
        ui->tableViewDataList->setModel(mStdItemModel);
    
        //设置tableView可以整行选中
        ui->tableViewDataList->setSelectionBehavior(QAbstractItemView::SelectRows);
    
        //设置表头背景色
        //ui->tableViewDataList->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");
    
        //设置不可双击编辑
        ui->tableViewDataList->setEditTriggers(QAbstractItemView::NoEditTriggers);
    
        //添加窗体,修改窗体信号与槽连接需要非空对象
        mAddDlg = new AddDialog();
        mMdfDlg = new ModifyDialog();
    
        //初始化右键菜单对象
        mMenu = new QMenu(ui->tableViewDataList);
        mDelAction = mMenu->addAction("删除");
        mAddAction = mMenu->addAction("添加");
    
        //连接信号槽函数,接收并处理 添加页面发来的数据
        connect(mAddDlg, SIGNAL(sig_addData(StudentInfo)), this, SLOT(slot_addData(StudentInfo)));
    
        //设置菜单相应策略
        ui->tableViewDataList->setContextMenuPolicy(Qt::CustomContextMenu);
    
        //连接右键菜单 信号与槽
        connect(ui->tableViewDataList, SIGNAL(customContextMenuRequested(QPoint)),this, SLOT(slot_showMenu(QPoint)));
        connect(mDelAction, SIGNAL(triggered(bool)), this, SLOT(slot_delData(bool)));
        connect(mAddAction, SIGNAL(triggered(bool)), this, SLOT(slot_showAddDlg(bool)));
    
        //双击列表项时处理
        connect(ui->tableViewDataList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slot_modifyDataByDoubleClick(QModelIndex)));
    
        //修改窗体回传修改后的数据到主界面
        connect(mMdfDlg, SIGNAL(sig_modifyData(StudentInfo)), this, SLOT(slot_modifyData(StudentInfo)));
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //从数据库加载数据
    int MainWindow::loadData()
    {
        QSqlQuery sqlQuery(gDb);
        QString msg = "主机名:" + gDb.hostName() \
                    + "\n数据库:" +gDb.databaseName() \
                    + "\n用户名:" + gDb.userName();
        ui->labelMsg->setText(msg);
        ui->labelMsg->setToolTip(msg);
    
        bool ok = gDb.open();
        if(ok)
        {
            QString sql = "select * from " + QString(TABLENAME);
            ok = sqlQuery.exec(sql);
        }
    
        if(!ok)
        {
            //添加测试数据
            mStdItemModel->setItem(0,0,new QStandardItem("1001"));
            mStdItemModel->setItem(0,1,new QStandardItem("Liang"));
            return 0;
        }
    
        int i = 0;
        while(sqlQuery.next())
        {
            //qDebug()<<sqlQuery.value("id").toString()<<","<<sqlQuery.value("name").toString();
            mStdItemModel->setItem(i,0,new QStandardItem(sqlQuery.value("id").toString()));
            mStdItemModel->setItem(i,1,new QStandardItem(sqlQuery.value("name").toString()));
            i++;
        }
    
        QString tips;
        tips = tips.asprintf("成功加载 %d 条数据!", i);
        ui->statusBar->setToolTip(tips);
        ui->statusBar->showMessage(tips);
        return 0;
    }
    
    //添加数据
    void MainWindow::on_pushButtonAdd_clicked()
    {
        if(nullptr == mAddDlg)
        {
            mAddDlg = new AddDialog();
        }
        mAddDlg->exec();
    }
    
    //处理 来自添加页面的数据
    void MainWindow::slot_addData(StudentInfo info)
    {    
        QSqlQuery sqlQuery(gDb);
    
        //插入语句:"insert into Student values (1001,'liang')"
        QString sql = "insert into "+QString(TABLENAME)+" values (" +QString::number(info.id) +",'" + info.name +"')";
    
        QString result = "添加成功!";
        if(sqlQuery.exec(sql))
        {
            int count = mStdItemModel->rowCount();
            mStdItemModel->setItem(count,0,new QStandardItem(QString::number(info.id)));
            mStdItemModel->setItem(count,1,new QStandardItem(info.name));
            result += "id:" + QString::number(info.id);
        }
        else
        {
            result = "添加失败:"+sqlQuery.lastError().text();
        }
        ui->statusBar->setToolTip(result);
        ui->statusBar->showMessage(result);
    }
    
    //显示右键菜单
    void MainWindow::slot_showMenu(QPoint)
    {
        mMenu->exec(QCursor::pos());//在当前鼠标位置显示
    }
    
    //删除选中项
    void MainWindow::slot_delData(bool b)
    {
        Q_UNUSED(b);
    
        QSqlQuery sqlQuery(gDb);
    
        //获取的是列索引 ui->tableViewDataList->selectionModel()->currentIndex();
        QModelIndexList indexList = ui->tableViewDataList->selectionModel()->selectedRows();
        QModelIndex index;
    
        QString id;
        int i, sel, sucess = 0;
        int size = indexList.size();
        for(i=size-1; i>=0; i--)//倒着删除,顺着删除要处理索引偏移
        {
            index = indexList.at(i);
            sel = index.row();
            id= mStdItemModel->data(mStdItemModel->index(index.row(),0)).toString();//第row行第0列的内容
            //根据ID删除语句 "delete from Student where id='1001'"
            QString sql = "delete from "+QString(TABLENAME)+" where id='"+id+"'";
            if(sqlQuery.exec(sql))
            {
                sucess++;
                mStdItemModel->removeRow(sel);
            }
        }
    
        if(size>0)
        {
            QString tips;
            tips = tips.asprintf("选中 %d条数据,成功删除 %d 条数据!", size, sucess);
            ui->statusBar->setToolTip(tips);
            ui->statusBar->showMessage(tips);
        }
    
    }
    
    //添加
    void MainWindow::slot_showAddDlg(bool b)
    {
        Q_UNUSED(b);
        mAddDlg->exec();
    }
    
    //菜单的关于动作
    void MainWindow::on_actionAbout_triggered()
    {
        QMessageBox::information(this, "关于", "这是操作数据库的简单例子。");
    }
    
    //弹出修改数据窗口
    void MainWindow::slot_modifyDataByDoubleClick(QModelIndex modelIndex)
    {
        Q_UNUSED(modelIndex);
    
        QString id,name;
        int row;
        QModelIndex index = ui->tableViewDataList->currentIndex();
        if(index.isValid())
        {
            row = index.row();
            id= mStdItemModel->data(mStdItemModel->index(row,0)).toString();//第row行第0列的内容
            name= mStdItemModel->data(mStdItemModel->index(row,1)).toString();//第row行第1列的内容
            mMdfDlg->setContent(id, name);
            mMdfDlg->exec();
        }
    }
    
    //修改数据
    void MainWindow::slot_modifyData(StudentInfo info)
    {
        QSqlQuery sqlQuery(gDb);
    
        //修改语句:update Student set name='liang' where id=1001;
        QString sql = "update "+QString(TABLENAME)+" set name='" + info.name +"' where id=" + QString::number(info.id);
    
        QString result = "修改成功!";
        if(sqlQuery.exec(sql))
        {
            int i;
            QString id;
            int count = mStdItemModel->rowCount();
            for(i=0; i<count; i++)//根据id找到要修改的数据项
            {
                id = mStdItemModel->data(mStdItemModel->index(i,0)).toString();
                if(info.id == id.toInt())
                {
                    mStdItemModel->setItem(i,0,new QStandardItem(QString::number(info.id)));
                    mStdItemModel->setItem(i,1,new QStandardItem(info.name));
                    break;
                }
            }
        }
        else
        {
            result = "修改失败:"+sqlQuery.lastError().text();
        }
        ui->statusBar->setToolTip(result);
        ui->statusBar->showMessage(result);
    }
    

     modifydialog.h文件

    #ifndef MODIFYDIALOG_H
    #define MODIFYDIALOG_H
    
    #include <QDialog>
    #include <QIntValidator>
    
    #ifndef STUDENTSTRUCT
    //自定义信息结构体
    struct StudentInfo
    {
        int id;
        QString name;
    };
    #endif
    
    namespace Ui {
    class ModifyDialog;
    }
    
    class ModifyDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit ModifyDialog(QWidget *parent = 0);
        ~ModifyDialog();
        void setContent(QString id, QString name);
    
    signals:
        void sig_modifyData(StudentInfo);
    
    private slots:
        void on_pushButtonReturn_clicked();
    
        void on_pushButtonModify_clicked();
    
    private:
        Ui::ModifyDialog *ui;
        QIntValidator* mIntValidator;
    };
    
    #endif // MODIFYDIALOG_H
    

    modifydialog.cpp文件 

    五、总结

    5.1 使用MySQL数据库需要启动MySQL服务。

     ps:打开这个服务管理界面:直接搜索services.msc并启动,或者是在命令行(黑窗口)输入services.msc并回车即可弹出该界面。

    5.2 编程使用MySQL数据库相关操作类,需要在.pro文件添加: QT += sql

     

    5.3 有一些版本的QtCreator需要将一个libmySQLdll库放在编译器的路径下(一般为mingwxxx/bin)

     

     

     

    展开全文
  • qt的main.cpp文件中连接SQlite数据库,并且创建用户表、心愿表、评论表。稍加修改也可以连接mysql数据库
  • 中标麒麟+QT+达梦数据库

    千次阅读 2021-03-07 21:35:42
    中标麒麟+QT+达梦数据库环境版本说明中标麒麟的安装达梦数据库的安装和...数据库七、Qt通过unixODBC连接数据库数据库安装和连接过程中可能会出现的问题一、错误信息输出方式二、socket未连接(网络通信异常)三、Can'...

    环境版本说明

    背景:项目需要开发一个单机应用程序
    操作系统:中标麒麟操作系统(兆芯版)
    数据库:达梦数据库V7
    开发工具:Qt Creator
    开发技术:Qt开发框架、C++

    中标麒麟的安装

    在虚拟机安装中标麒麟,操作步骤跟一般步骤一样,需要注意的点有两个:
    1.在选择运行内存大小时,将运行内存大小提高至3G(后面安装达梦数据库时会用到)。
    2.在系统安装向导中,记得勾选同时安装SDK工具,这样就会把编程工具一起安装好。
    安装好后重启虚拟机即可。

    达梦数据库的安装和连接

    一、创建安装用户、组(root下操作)

    达梦官方建议新建本地用户来安装数据库,目的是减少对操作系统的影响。
    1.创建一个名为dinstall的组

    groupadd dinstall
    

    2.建立一个名为dmdba的用户

    useradd -g dinstall dmdba
    

    3.设置用户dmdba的密码

    passwd dmdba
    

    二、新建安装数据库的文件(root下操作)

    1.新建名为dm7的文件,此时若命令的目录处于桌面的话([root@localhost 桌面]),那dm7会在我的电脑–>本地磁盘中生成。

    mkdir /dm7
    

    2.设置拥有dm7的用户,将dm7的拥有者指定为dinstall组下的dmdba用户。

    chown dmdba:dinstall -R /dm7
    

    三、挂载ISO文件(root下操作)

    使用命令:mount iso文件路径 要挂载的文件路径。以下面为例,iso文件放置在桌面,命令头处于[root@localhost 桌面]状态。

     mount -o loop dm7_20200813_x86_rh6_64_ent_7.6.1.66.iso /mnt
    

    挂载成功后会提示:mount:/dev/loop0写保护,将以只读的方式挂载。

    四、安装数据库

    直接在当前用户界面,通过终端切换成dmdba进入mnt文件执行DMInstall.bin会提示图形化界面安装失败,可以有如下两种方式处理:
    1.在root下执行命令:

    xhost +
    

    再执行如下2的命令。
    2.通过虚拟机切换到dmdba用户界面,再执行命令:

    [dmdba@localhost mnt]./DMInstall.bin
    

    3.在安装过程中可能会提示你一次打开文件数量不足,此时可以通过进入limits.conf文件进行修改,在root下进行。

    vim /etc/security/limits.conf
    

    再依次点击i进入insert模式、在文档最后添加如下信息:

    * soft nofile 4096
    * hard nofile 65536
    * soft nproc 4096
    * hard nproc 65536
    

    添加完成后保存退出,并reboot重启服务。
    4.安装过程中,选择/dm7目录,安装完成后在root下执行指定代码启动数据库服务。
    注:在dmdba用户下默认地址是/home/dmdba/dmdbms,在root下则为/opt/dmdbms。
    在这里插入图片描述
    在这里插入图片描述

    五、创建实例

    上述操作完成之后,会自动弹出初始化达梦数据库实例运行界面。按操作完成即可,也可以到/dm7的tool文件夹下的dbca.sh运行创建实例界面。一切基本默认就可以。
    在这里插入图片描述
    初始端口默认是5236,这个要记得,连接数据库时需要它。
    在这里插入图片描述
    在这里插入图片描述
    创建完实例后需要在root下执行如下三条命令。(系统会有提示)
    在这里插入图片描述
    在这里插入图片描述
    安装完成后,在/dm7目录下的tool文件夹就可以找到常用的客户端管理工具。最常用的有如下几种:
    1.管理工具 Manager:用于管理用户、模式、表空间等。
    2.实例创建 dbca.sh:用于创建实例。
    3.服务管理dmservice:用于管理实例运行状态。
    此外还需检查dmdba下.bash_profile中有关路径配置是否正确,如有问题,则自己添加,正确的路径显示应该如下:
    在这里插入图片描述

    六、使用unixODBC连接达梦数据库

    1.达梦数据库在安装的时候都默认安装ODBC驱动,可以通过命令:

    odbcisnt -j
    

    查看是否安装,如果出现如下图所示情况,则说明安装完成。
    在这里插入图片描述
    注:有时候etc目录下并不存在odbc.ini,新建一个貌似不会影响,这里我也搞不太懂,希望有人能指点一下。
    2.接下来对odbcinst.ini和odbc.ini这两个文件进行编辑(在root下进行)。
    在odbcinst.ini中添加如下红框代码:
    在这里插入图片描述
    在odbc.ini中添加如下红框代码:
    在这里插入图片描述
    注:其中odbc.ini的Driver(DM7 ODBC DRIVER)与odbcinst.ini的开头[DM7 ODBC DRIVER]保持一致。Odbcinst.ini中的Driver指向数据库安装目录中的libdodbc.so。odbc.ini中的UID,PWD指向实例用户及其密码一般用SYSDBA即可,TCP_PORT则指向端口。
    3.测试,在终端输入:isql DM7
    在这里插入图片描述
    这里就表示连接成功。

    七、Qt通过unixODBC连接数据库

    1.由上述步骤可知:我们数据库安装路径只在dmdba用户下设置过(第五最后处),因此Qt项目只有在dmdba用户的界面下创建才可以正常连接到数据库,若要在其他本地用户界面连接数据库,则可以参考第五最后对于dmdba用户.bash_profile的设置,对自己想要修改的用户进行路径修改,修改后使用命令:

    source .bash_profile
    

    使配置生效,更保险的可以再重新启动一下。
    2.代码连接实例
    在pro文件添加sql后那一行代码应该为:

    QT +=core gui sql 
    
    #include "mainwindow.h"
    #include <QApplication>
    #include <QSqlDatabase>
    #include <QDebug>
    #include<QSqlError>
    int main(int argc, char *argv[])
    {
    //    QApplication a(argc, argv);
    //    MainWindow w;
    //    w.show();
    //    return a.exec();
        QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");//固定二选一
        db.setDatabaseName("DM7");//跟odbc.ini文件中的头保持一致[DM7]
        db.setPort(5236);//端口
        db.setHostName("localhost");//本地的用localhost
        db.setUserName("SYSDBA");//用户名
        db.setPassword("SYSDBA");//我使用的是默认口令
        if(db.open()){
            qDebug()<<"connnect right";
            db.close();
            return true;
        }else{
            qDebug()<<db.lastError();
            return false;
        }
        }
    

    连接成功后输出”connect right“。

    数据库安装和连接过程中可能会出现的问题

    由于之前测试的时候很多错误信息都没有截图保留下来,因此在下面介绍时只提一些错误的关键词。

    一、错误信息输出方式

    1.在连接用终端进行unixODBC连接测试时,可以使用-V来打印出错误信息:

    isql -V DM7
    

    2.在用Qt连接程序时,输出连接错误信息的话可以通过lastError()函数,具体实现可以见上述Qt连接实例。

    下面就开始介绍常见的错误类型及解决方式

    二、socket未连接(网络通信异常)

    socket未连接这个是很常见的一个错误,也是比较容易解决的错误,一般出现这个问题可以从如下几个方面查找问题:
    1.检查输入口令是否正确。
    2.使用dmservice.sh工具检查数据库实例是否启动,是否创建。
    (1)如果实例不存在,则可以通过dbca.sh工具创建实例。
    (2)若发现dmservice.sh中数据库实例未启动,则可以通过终端在root下启动dmservice.sh再手动启动数据库实例(用鼠标点击打开dmservice.sh的话,在启动的时候会提示用root来启动)。一般情况下启动两个即可。
    在这里插入图片描述
    3.检查防火墙状态
    防火墙状态查看可以使用如下命令:

    systemctl status firewalld
    

    在这里插入图片描述
    一般情况下,本地连接数据库是不会出现因为防火墙导致的错误。这种错误常见在连接在服务器的数据库。

    临时关闭防火墙可以使用如下命令:

    systenctl stop firewalld
    

    三、Can’t open lib ‘/dm7/bin/libdodbc.so’ : file not found

    这个错误出现频率是最高的,只要是配置文件出错,或者是配置文件不生效,都会出现这个错误。记住这个错误,最最最主要原因还是要回归到配置文件。
    1.配置文件.bash_profile不生效。
    明确自己是在那个用户下开发Qt程序,如果你是在dmdba下就配置dmdba的.bash_profile,在其他用户下开发就配置其他用户的.bash_profile并使其生效。
    在这里插入图片描述
    上面是我在ljr用户上的配置,其实跟在dmdba上的配置一样。一开始我就是没想到这个,以为只要在dmdba上配置.bash_profile就可以所有用户通用。希望后来小白能注意到这个点,避开这个坑。

    配置完成后使用命令:

    source .bash_profile
    

    2.odbc.ini和odbcinst.ini设置有问题
    这个会出现问题一般都是没有两个名字没有对应起来。具体见上述配置步骤。

    Manger工具一些基础操作

    在创建数据库实例时,最好选择同时安装两个已有的案例,BOOKSHOP,DMHR,后面可以做一些实验。

    对现有表操作流程如下:

    在这里插入图片描述

    新建一个表空间

    个人理解表空间可以看成类似mysql数据库中我们创建的数据库存放数据的空间,表空间文件后缀名为.DBF,安装时我们选择的安放表空间数据库文件为DAMENG
    1.新建表空间。在表空间处右键–>新建表空间。
    在这里插入图片描述
    2.新建管理用户。赋予权限和管理的表空间,之后会在模式上生成对应的模式。
    在这里插入图片描述
    用户命名会生成对应模式,且名字相同。这里我命名为TESTDB
    在这里插入图片描述
    3.在模式下新建表。设置完表属性后可以直接在右边表中直接录入数据。
    在这里插入图片描述

    资料参考

    达梦数据库官方哔哩哔哩链接
    达梦数据库官方文档和软件下载链接
    达梦数据库官方讨论社区
    讨论3群号:113992625 群里人都挺热心。

    最后

    本博客来自本人这阵子安装数据库和连接碰到的问题的总结,如果缺失或错漏欢迎大家在评论区或私信我指正,希望这篇博客能对跟我一样初入坑的小白能有所帮助。

    展开全文
  • qt连接Oracle数据库

    2020-06-14 14:54:16
    要连接的前提首先是在qt安装过程中下载src,才有%QTDIR%\qtbase\src\plugins\sqldrivers How to Build the OCI Plugin on Windows Choosing the option “Programmer” in the Oracle Client Installer from the ...

    摘自官方文档 https://doc.qt.io/qt-5/sql-driver.html

    • 要连接的前提首先是在qt安装过程中下载src,才有%QTDIR%\qtbase\src\plugins\sqldrivers

    How to Build the OCI Plugin on Windows
    Choosing the option “Programmer” in the Oracle Client Installer from the Oracle Client Installation CD is generally sufficient to build the plugin. For some versions of Oracle Client, you may also need to select the “Call Interface (OCI)” option if it is available.

    • Build the plugin as follows (here it is assumed that Oracle Client is installed in C:\oracle):
    cd %QTDIR%\qtbase\src\plugins\sqldrivers
    qmake -- OCI_INCDIR=c:/oracle/oci/include OCI_LIBDIR=c:/oracle/oci/lib/msvc
    nmake sub-oci
    

    If you are not using a Microsoft compiler, replace nmake with mingw32-make in the line above.

    When you run your application, you will also need to add the oci.dll path to your PATH environment variable:
    运行app前,把oci.dll的目录加入到环境变量中

    set PATH=%PATH%;c:\oracle\bin
    

    下面是连接测试

    #include "mainwindow.h"
    #include <QApplication>
    #include<QDebug>
    #include<QSqlDatabase>
    
    int main(int argc, char *argv[])
    {
        //初始化窗口系统
        QApplication a(argc, argv);
        //读取数据库
        QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
        db.setHostName("localhost");
        db.setDatabaseName("ORCL");
        db.setPort(1521);
        db.setUserName("system");
        db.setPassword("orcl");
        if(db.open())
        {
            qDebug()<<"open";
        }else
        {
            qDebug()<<"open error";
        }
        MainWindow w;
        w.show();
        return a.exec();
    }
    
    展开全文
  • 1. 初始化 void MainWindow::initPlot(QCustomPlot* customPlot) { customPlot->setNotAntialiasedElements(QCP::aeAll); QFont font; font.setStyleStrategy(QFont::NoAntialias); customPlot->xAxis-&...
  • Qt下Sqlite数据库的操作(1)

    万次阅读 多人点赞 2018-08-28 17:08:51
    Sqlite数据库作为Qt项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一(Sqlite就像Qt的亲儿子,如同微软兼容Access数据库一样)。关于Sqlite和Qt的千丝万缕的故事,有机会再说(各位看...
  • QT读写Sqlite数据库的三种方式

    万次阅读 多人点赞 2018-07-29 16:44:11
    QT对一些基本的数据库的访问封装,可谓是极大的方便的我们开发人员,现在我们就来说下QT对Sqlite这个数据库的读写,Sqlite是一个比较小型的本地数据库,对于保存一些软件配置参数或量不是很大的数据是相当的方便,Qt...
  • Qt之Sqlite数据库

    2020-04-18 23:42:04
    Qt之Sqlite数据库概述:代码示例:初始化并打开数据库查询表数据更新一条数据插入一条数据删除一条数据over:文末一句话: 概述: 1. Sqlite是一款轻量级的关系型数据库,运行速度非常快,通常是需要几百KB的内存就...
  • Qt + MySQL + SQLServer 数据库

    千次阅读 2018-04-12 10:44:01
    数据库是大部分项目中需要使用的,MySQL 和 SQLServer 是一半公司会选择的,在开发过程中很容易遇到各种问题,接下来是我用 Qt 来连接 MySQL 和 SQLServer 的讲解! Qt + MySQL Qt 版本说明 MySQL 驱动问题 Qt 测试...
  • 以前的时候写过两个学生管理的数据库系统。...本质上和和以前写的版本并没有什么区别(当然,这里用Qt的Sql接口支持大多数Sql语句,而且并不限一个数据库,一个表),按照数据库的历史发展,都属于数据库阶段的数...
  • PyQt 有内置的数据库连接类 QtSql 。...初始化 db = QtSql.QSqlDatabase.addDatabase('QMYSQL') db.setHostName('localhost') db.setDatabaseName('dev') db.setUserName('root') db.setPassword('123') d
  • 开发环境:Windows10+QT5.14.2+Oracle11G R2 操作步骤: 1、打开QT软件,创建一个新的Application项目 2、设计界面并修改代码: 2.1修改项目配置文件,添加sql字符串表示要对数据库进行操作。 ...
  • Qt数据库编程

    千次阅读 2018-10-25 15:14:18
    Qt使用数据库sqlite 版本说明 版本 作者 日期 备注 0.1 loon 2018.10.25 初稿 目录 文章目录Qt使用数据库sqlite版本说明目录一、需求和目的二、使用说明1、Qt 5.6.0的数据库操作类...
  • QT数据库操作常用类介绍 用法实例 数据准备 创建实体类 创建数据库访问类 个人总结 关于如何获取数据库执行过程中的错误以及判断SQL语句执行是否成功执行 关于参数SQL语句 基于命名的参数SQL语句 ...
  • Qt操作sqlserver数据库

    千次阅读 2020-05-18 17:56:48
    由于数据库实验作业规定必须要做可视界面,所以摸鱼怪也只好继续肝 Qt 了 (;´༎ຶД༎ຶ`) 准备工作 这里的准备工作就是就是建数据库、建表、然后就是在控制面板配置 ODBC 数据源 准备内容与以前写的 VS2017操做...
  • QT自带的QSqlite数据库中实现id主键自增长 QSqlite是QT自带的轻量级数据库,使用起来非常方便,对系统环境也没有任何的环境要求,可移植性非常好,适合数据量不是太大,要求不是太高的程序。本文中,就介绍一点,...
  • Qt 操作SQLite数据库

    2019-08-16 15:13:00
    项目中通常需要采用各种数据库(如...Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一(Sqlite就像Qt的亲儿子,如同微软兼容Access数据库一样)。Qt5 以上版本...
  • QT项目--简单的数据库可视系统

    千次阅读 2019-11-06 21:43:26
    简单的数据库可视系统 文章目录简单的数据库可视系统项目截图项目代码custommessagebox.hcustommessagebox.cppdatabases.hdatabases.cppdblogin.hdblogin.cppmain.cpp 项目功能:用户可以通过界面互动的方式对...
  • 在工程头文件中添加对应qtsql头文件,声明QSqlDatabase类对象,以及自定义的数据库初始化接口DbInit。 #include <QtSql> QSqlDatabase db; bool DbInit(); 还有一些数据库操作的槽函数: private ...
  • QT调用SQLITE数据库

    千次阅读 2018-08-10 16:45:24
    3 在需要调用数据库的窗口的构造函数中打开数据库 注意:数据库要在你的项目创建文件夹中,或者在函数中添加绝对路径 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabase...
  • 将mysql中的两个文件libmysql.dll;libmysql.lib放在D:\QT512\5.12.2下编译环境的bin和include目录下
  • Qt提供了与数据库联动以开发应用程序的模块。与其他API相比,Qt提供的API更直观,也更容易理解。使用Qt提供的API之前,需要添加如下的头文件。 #include &lt;QtSql&gt; 为使用Qt开发应用程序,与使用C++...
  • QT数据库单例类 首先咱们理解一下什么是单例模式 单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文...
  • 关注、星标公众号,直达精彩内容来源:feiyangqingyun一、前言近期花了两个多月时间,将数据库相关的代码重新封装成了各种轮子(这条路必须打通,打通以后,相关项目只需要引入这个组件p...
  • 在前面的章节里,我们使用了下面的函数创建和取得数据库连接: void createConnectionByName(const QString &amp;connectionName) { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", ...
  • Qt连接mysql数据库踩过的坑 最近要做的项目需要Qt连接MySQL数据库,刚开始接触,踩了不少坑,记录一下。 1.环境 操作系统:Windows10 Qt:5.14.2 Qt Creator:4.11.1 MySQL:mysql-8.0.26-winx64 Navicat:12.0.29...
  • 采用SQLITE数据库,废话不多说,直接上代码。 2 实现 使用时只需将头文件和源文件加入工程,在要用到配置的地方使用appDatabaseInstance。 2.1 databasesql.h #ifndef DATABASESQL_H #define DATABASESQL_H ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,557
精华内容 2,622
关键字:

qt初始化数据库