QtCreator5.3 连接SQLServer2008,QSqlDatabase,QSqlError,QSqlQuery

时间:2021-04-25 10:45:29

数据库

驱动层:为具体的数据库与SQL 接口层之间提供了桥梁

SQL接口层提供了对数据库的访问,QSqlDatabase用来创建连接,QSqlQuery可以使用Sql语句来实现与数据库交互

用户接口层实现了将数据库中的数据连接到了窗口部件上

QtCreator5.3 连接SQLServer2008,QSqlDatabase,QSqlError,QSqlQuery

1 连接数据库

QtCreator5.3 连接SQLServer2008,QSqlDatabase,QSqlError,QSqlQuery

查看数据库默认支持的驱动

1.1 新建空的Qt项目,在.pro文件中加入QT += sql

QT       += sql
1.2 编写main.cpp

使用QSqlDatabase::drivers()函数查看系统支持的驱动,返回的是驱动列表

#include <QApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QStringList>
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    qDebug() << "Available drivers:";
    QStringList drivers = QSqlDatabase::drivers();
    foreach(QString driver,drivers)
        qDebug() << driver;
 
    return app.exec();
}
 2 创建数据库连接 

2.1 创建数据源DSN,命名成ra

2.2 建立基于QMainWindow的项目,

2.3 在主界面上上面用QFormLayout,建立如下界面,并命名各个控件,QFormLayout用法

QtCreator5.3 连接SQLServer2008,QSqlDatabase,QSqlError,QSqlQuery           QtCreator5.3 连接SQLServer2008,QSqlDatabase,QSqlError,QSqlQuery

在mainwindow.h头文件中

#include <QSqlError>
 为MainWindow添加函数 

    QString driverName() const;//获取数据库驱动类型
    QString databaseName() const;//获取数据库DSN名称
    QString userName() const;//登陆用户名
    QString password() const;//密码
    QString hostName() const;//主机
    int port() const;//端口
    QSqlError addConnection(const QString &driver,const QString &dbName,
                            const QString &host, const QString &user,
                            const QString &password, int port = -1);//添加连接
    void createSqliteDB();//创建内存数据库
添加槽函数

private slots:
    void on_okButton_clicked();//连接的槽函数
 
    void on_cancelButton_clicked();//退出槽函数
 
    void driverChanged(const QString &Text);//当选择数据库驱动后,有一个响应的槽函数根据驱动的变化选择是否设置主机信息

在mainwindows.cpp中实现这些函数

在构造函数中

    
    ui->cboDataDriver->addItems(QSqlDatabase::drivers()); //设置可以悬着的驱动类型
 
    //关联下拉列表框cboDataDriver的当前值变化信号与驱动改变槽函数
    connect(ui->cboDataDriver,SIGNAL(currentIndexChanged(QString)),this,SLOT(driverChanged(QString)));
    ui->lblStatus->setText("准备连接数据库!");

设置获取参数函数

QString MainWindow::driverName() const
{
    return ui->cboDataDriver->currentText();
}
 
QString MainWindow::databaseName() const
{
    return ui->leDatabase->text();
}
 
QString MainWindow::userName() const
{
    return ui->leUserName->text();
}
 
QString MainWindow::password() const
{
    return ui->lePassword->text();
}
 
QString MainWindow::hostName() const
{
    return ui->leHostName->text();
}
 
int MainWindow::port() const
{
    return ui->spbPort->text().toInt();
}

void MainWindow::driverChanged(const QString &text)//根据用户选择的数据库驱动类型设置其他控件的状态
{
    if (text == "QSQLITE") {
        ui->leDatabase->setEnabled(false);
        ui->leUserName->setEnabled(false);
        ui->lePassword->setEnabled(false);
        ui->leHostName->setEnabled(false);
        ui->spbPort->setEnabled(false);
    }
    else {
        ui->leDatabase->setEnabled(true);
        ui->leUserName->setEnabled(true);
        ui->lePassword->setEnabled(true);
        ui->leHostName->setEnabled(true);
        ui->spbPort->setEnabled(true);
    }
}

void MainWindow::on_okButton_clicked()
{
    if (ui->cboDataDriver->currentText().isEmpty()) {
        ui->lblStatus->setText(tr("请选择一个数据库驱动"));
        ui->cboDataDriver->setFocus();
    } else if (ui->cboDataDriver->currentText() == "QSQLITE") {
        createSqliteDB();
    } else {
        QSqlError err = addConnection(driverName(),databaseName(),hostName(),
                                      userName(),password(),port());
        if (err.type() != QSqlError::NoError) {
            ui->lblStatus->setText(err.text());
        }
        else {
            ui->lblStatus->setText(tr("连接数据库成功!"));
        }
    }
}

void MainWindow::on_cancelButton_clicked()
{
    exit(0);//退出程序
}

QSqlError MainWindow::addConnection(const QString &driver, const QString &dbName, const QString &host, 
 const QString &user, const QString &password, int port)//创建连接
{
    static int cCount = 0;
    QSqlError err;
    QSqlDatabase db = QSqlDatabase::addDatabase(driver,QString("conn%1").arg(++cCount));
    db.setDatabaseName(dbName);//dbName是设置的数据源名称,到时候填写ra就可以
    db.setHostName(host);
    db.setPort(port);
    if (!db.open(user,password)) {
        err = db.lastError();
        db = QSqlDatabase();
        QSqlDatabase::removeDatabase(QString("conn%1").arg(cCount));
    } else {
        QSqlQuery query(db);
        qDebug() << query.exec("create table student (id int,name varchar(20))");
        qDebug() << query.exec("insert into student values(1,'first')");
        qDebug() << query.exec("insert into student values(2,'second')");
    }
    return err;
}
 
 
void MainWindow::createSqliteDB()
{
    QSqlDatabase::database("in_mem_db",false).close();
    QSqlDatabase::removeDatabase("in_mem_db");
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "in_mem_db");
    db.setDatabaseName(":memory:");
    bool ok = db.open();
    qDebug() << ok;
    if(!ok) {
        ui->lblStatus->setText(db.lastError().text());
        return;
    }
    QSqlQuery q(db);
    qDebug() << q.exec("drop table student");
    qDebug() << q.exec("create table student (id int,name varchar(20))");
    qDebug() << q.exec("insert into student values(1,'first')");
    qDebug() << q.exec("insert into student values(2,'second')");
    ui->lblStatus->setText(tr("创建sqlite数据库成功!"));
    q.exec("select * from student");
    while (q.next()) {
        qDebug() << q.value(0).toInt() << q.value(1).toString()
                 << q.value(2).toString() <<q.value(3).toString();
    }
}