• 28623阅读
  • 13回复

QT操作SQLITE数据库(一) [复制链接]

上一主题 下一主题
离线wvins
 
只看楼主 倒序阅读 楼主  发表于: 2008-09-24
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
实在是太冷清了,过来加点人气.

今天下载了一个SQLite玩玩,大概200多K.
和Access类似,通过一个Exe文件操作数据库文件的.
所以,我想这样的数据库能够满足我的跨平台需要吧.在Linux下和Windows下面只要是链接这个数据库文件就行了吧?(还没试,暂时这么认为吧!)

在连接SQLite的过程中尝试了两种方法,也遇到了一些问题,不过终于是连接上了,记录一下.希望对后来者有些帮助.
一种方式是通过QT提供的Driver的方式连接数据库,代码如下:
#include <QApplication>
#include <QSqlDatabase>
#include <QMessageBox>
//#include <QSQLiteDriver> 这个不知道干嘛的,没用上
#include <QTextcodec>

int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
//这句话大家比我熟了,反正是没有乱码了
QApplication app(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
//这个地方我开始的时候使用了SQLITE追悔莫急
db.setDatabaseName("aaaa");
//aaaa是通过SQLite程序创建的数据库文件,当前文件夹下
if ( !db.open())
{
QMessageBox::critical(NULL, QObject::tr("Collection"), QObject::tr("数据库连接失败!"));
return 0;
}
return app.exec();
}

一种方式是基于SQLite的接口方式操作数据库文件.可以参考以下文章
http://blog.csdn.net/zieckey/archive/2006/06/29/848161.aspx
我没有试成功,也不喜欢这种太底层的操作.
而且需要下载SQLite的源代码编译,比较复杂.
不推荐.

至于读取数据执行SQL语句的方法,摸索出来再贴.
离线wvins
只看该作者 1楼 发表于: 2008-09-24
Delphi里面
ADOConnection用来建立数据库连接
Dataset用来存放数据.
DataSource用来连接DataSet和显示控件.
--------------
希望高手给讲解一下QT中的数据库操作层次结构!
不胜感激

J.A.M 即日
离线wvins
只看该作者 2楼 发表于: 2008-10-31
一不小心跌到15页以后了。
今天又把这段代码拿出来添加了界面显示因素,把在这其中遇到的问题列出来,供大家参考。
-------------------
#include <QApplication>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QTextcodec>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QTableView>

int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QApplication app(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
//创建不带名称的数据库连接,可以理解成ADO中的Connection
//参见QSqlDatabase的文档http://doc.trolltech.com/4.0/qsqldatabase.html#addDatabase
db.setDatabaseName("aaaa");
if ( !db.open())
{
QMessageBox::critical(NULL, QObject::tr("Collection"), QObject::tr("数据库连接失败!"));
return 0;
}
QSqlQueryModel * qModel = new QSqlQueryModel;
/*
qModel->setHeaderData(0, Qt::Horizontal, "ID");
qModel->setHeaderData(1, Qt::Horizontal, "Name");

这一段不知道做什么用的
*/
qModel->setQuery("select * from x");
//这里使用了默认的数据库连接
//同样参考QSqlQueryModel的文档
http://doc.trolltech.com/4.0/qsqlquerymodel.html#setQuery-2
//这个地方遇到几个问题:
//1.qModel->query().exec("select * from x"); Delphi代码写多了,习惯性写成一下样子
// qModel->query.exec("select * from x");
// 2.qModel->query().exec("select * from x"); 和
// qModel->setQuery("select * from x");
// 是有区别的,上面一句不能得到结果,下面一句可以。
QTableView tableView;
tableView.setModel(qModel);
tableView.show();
return app.exec();
}

===========
参考源代码链接如下:
http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/QSqlQueryModelQSqlTableModel.html

代码只有自己写了才会知道什么地方有问题,会出问题。
下一步会尝试把图标写入数据库中。
[ 此贴被wvins在2008-10-31 17:30重新编辑 ]
离线wvins
只看该作者 3楼 发表于: 2008-10-31
不过经测试发现不支持中文显示...
这个问题只能稍后在解决了。

--------------
        QSqlQuery query;
        ...
        QSqlRecord record = query.record();
        QSqlField field = record.field("country");
这段话描述了Qt中数据集的层次结构了
    QSqlQuery    表示数据集
    QSqlRecord 表示数据集中的一条记录
    QSqlField    表示数据记录的一个字段值
---------------
[ 此贴被wvins在2008-10-31 17:31重新编辑 ]
离线6楼男生
只看该作者 4楼 发表于: 2009-03-11
thank you for your share
离线songxizg

只看该作者 5楼 发表于: 2009-03-11
要顶的
离线wd007

只看该作者 6楼 发表于: 2009-03-11
这个不错的
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线fzusuper
只看该作者 7楼 发表于: 2009-03-12
大侠可以留个联系方式吗?
离线ren0065
只看该作者 8楼 发表于: 2009-03-16
啊里啊到,库大一马斯
离线wcsdk
只看该作者 9楼 发表于: 2010-04-09
我的qt-embedded4.6在arm上运行的时候常出现"segmentation fault"错误而且在执行exec函数时有很多在pc上可以执行的命令执行不了。诸位有没遇到过,现在打算试试楼主的第二种方法
离线mamatengwo
只看该作者 10楼 发表于: 2010-08-23
使劲顶一下。。
离线davis45
只看该作者 11楼 发表于: 2010-09-10
呃……后面没有了?
谢谢大家的指教
离线jidonghui123
只看该作者 12楼 发表于: 2011-11-03
回 楼主(wvins) 的帖子
很好
离线stlcours

只看该作者 13楼 发表于: 2015-01-06
谁能帮助我一下,开发机上没问题,测试机上driver not loaded driver not loaded
并且我没有使用 new QSqlDatabase 的形式。
快速回复
限100 字节
 
上一个 下一个