数据库
驱动层:为具体的数据库与SQL 接口层之间提供了桥梁
SQL接口层提供了对数据库的访问,QSqlDatabase用来创建连接,QSqlQuery可以使用Sql语句来实现与数据库交互
用户接口层实现了将数据库中的数据连接到了窗口部件上
1 连接数据库
查看数据库默认支持的驱动
1.1 新建空的Qt项目,在.pro文件中加入QT += sql
QT += sql1.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用法
在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();
}
}