QSqlQuery 如何与数据库保持关联

   学习qt 的时候一直疑惑 QSqlQuery query ,QSqlTableModel model,如何与数据库连接相关联,毕竟没有数据库名的相关设置。以下是代码:

#include <QCoreApplication>
#include <QtCore>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlQuery>
#include <QTime>
#include <QSqlError>
#include <QtDebug>
#include <QSqlDriver>
#include <QSqlRecord>
#pragma execution_character_set(“utf-8”)

int main(int argc, char argv[])
{
Q_UNUSED(argc);
Q_UNUSED(argv);
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
//如下面这种设置,程序就无法走下去
// QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”,“hello”);
db.setDatabaseName(":memory:");
bool ret = db.open();
if(!ret)
{
qDebug()<<"open database failed. "<<db.lastError().driverText()<<endl;
return -1;
}
QSqlQuery query;
QString table=“create table automobil”
“(id int primary key,”
“attribute varchar,”
“type varchar,”
“kind varchar,”
“nation int,”
“carnumber int,”
“elevaltor int,”
“distance int,”
“oil int,”
“temperature int)”;
ret = query.exec(table);
if(ret)
qDebug()<<QObject::tr(“数据库表创建成功!\n”);
else
{
qDebug()<<QObject::tr(“数据库表 创建失败! \n”);
return -1;
}
//search
query.exec("select count(
) from automobil");
QSqlRecord rec = query.record();
qDebug()<<QObject::tr(“automobil 表字段数:”)<<rec.count();
//inset
QTime t;
t.start();
query.clear();
query.prepare(“insert into automobil values(?,?,?,?,?,?,?,?,?,?)”);
long records = 100;
for(int i=0;i<records;i++)
{
query.bindValue(0,i);
query.bindValue(1,“四轮”);
query.bindValue(2,“轿车”);
query.bindValue(3,“富康”);
query.bindValue(4,rand()%100);
query.bindValue(5,rand()%10000);
query.bindValue(6,rand()%300);
query.bindValue(7,20000);
query.bindValue(8,52);
query.bindValue(9,100);
ret = query.exec();
if(!ret)
{
QSqlError lastError = query.lastError();
qDebug()<<lastError.driverText()<<QObject::tr(" 插入失败");
return -1;
}
}
qDebug()<<QObject::tr(“插入 %1 条记录, 耗时: %2 ms”).arg(records).arg(t.elapsed());
// soft
t.restart();
ret = query.exec(“select * from automobil order by id desc”);
if(ret)
qDebug()<<QObject::tr(“排序%1条记录, 耗时: %2 ms”).arg(records).arg(t.elapsed());
else
qDebug()<<QObject::tr(“排序失败!”);
t.restart();
//update
for(int i=0;i<records;i++)
{
query.clear();
query.prepare(QString(“update automobil set attribute=?,type=?,kind=?,nation=?,carnumber=?,elevaltor=?,”
“distance=?,oil=?,temperature=? where id=%1”).arg(i));
query.bindValue(0,“四轮”);
query.bindValue(1,“轿车”);
query.bindValue(2,“富康”);
query.bindValue(3,rand()%100);
query.bindValue(4,rand()%10000);
query.bindValue(5,rand()%300);
query.bindValue(6,rand()%20000);
query.bindValue(7,rand()%52);
query.bindValue(8,rand()%100);
ret=query.exec();
if(!ret)
{
QSqlError lastError=query.lastError();
qDebug()<<lastError.driverText()<<QObject::tr(" 更新失败");
}
}
qDebug()<<QObject::tr(“更新 %1 条记录, 耗时: %2 ms”).arg(records).arg(t.elapsed());
//delete
t.restart();
query.exec(“delte from automobil where id=15”);
qDebug()<<QObject::tr(“删除一条记录, 耗时: %1 ms”).arg(t.elapsed());
return 0;
}

仔细观察发现 QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
事件调用为:
static QSqlDatabase addDatabase(const QString& type,
const QString& connectionName = QLatin1String(defaultConnection));
static QSqlDatabase addDatabase(QSqlDriver* driver,
const QString& connectionName = QLatin1String(defaultConnection));
有一个defaultConnection的默认连接名。
查看源码发现qsql 用一个全局的静态哈希对象存储连接,键值对为如下方式: connectionName,QSqlDatabase;
而 QSqlQuery query 实际构造如下,用第2个:
explicit QSqlQuery(QSqlResult *r);
explicit QSqlQuery(const QString& query = QString(), QSqlDatabase db = QSqlDatabase());
explicit QSqlQuery(QSqlDatabase db);
QSqlQuery(const QSqlQuery& other);


QSqlQuery::QSqlQuery(const QString& query, QSqlDatabase db)
{
d = QSqlQueryPrivate::shared_null(); //默认空对象
qInit(this, query, db);
}
static void qInit(QSqlQuery *q, const QString& query, QSqlDatabase db)
{
QSqlDatabase database = db;
//这里往下走QSqlDatabase是默认设置,无意义,用defaultConnection 查找替换,即找到addDatabase(const QString& type,
const QString& connectionName = QLatin1String(defaultConnection))的设置
if (!database.isValid())
database = QSqlDatabase::database(QLatin1String(QSqlDatabase::defaultConnection), false);
if (database.isValid()) {
*q = QSqlQuery(database.driver()->createResult());
}
if (!query.isEmpty())
q->exec(query);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值