Linux平台QT数据库编程
作者:武汉华嵌技术部
在linux平台使用qt来编写GUI程序,在进行数据库编程的时候,有两种选择方式,分别是:基于linux平台的数据库接口函数编程,另一种是使用qt自带的有关数据库类。那在这里我分别来讲一下这两种方式的实现。
一、使用linux平台的数据库接口编程:
在这里我使用的是一款免费的数据库sqlite,从网络上下一个sqlite-3.0.8.tar.gz源码包,然后进行安装,安装好后就可以使用它提供的函数接口。接下来我们用安装好的sqlite提供的函数接口,在QT中使用的,代码片段示例如下:
这是一个槽函数,在这个槽函数实现了对数据库的操作,使用的是刚才自已安装好的sqlite数据库提供的API函数。
void Qt1::open_data()
{
int ret;
char *zErrMsg;
//打开数据库,如果这个数据库文件不存在,就创建它
ret = sqlite3_open("student.db",&db);
if(ret)
{
fprintf(stderr,"cannot open database:%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
exit(-1);
}
else
{
printf("you are right\n");
}
//SQL语句
char *sql = (char *)"CREATE TABLE StudentData(\
ID INTEGER PRIMARY KEY,\
SID TNTEGER,\
Name VARCHAR(20),\
Score INTEGER\
);";
//通过C接口来执行上面的一个SQL语句,创建一个表
sqlite3_exec(db,sql,0,0,&zErrMsg);
}
这里只是给了一个简单的实例,通过那些SQL语句,然后搭配上SQLITE提供的操作接口函数,我们就可以对数据库进行增、删、改、查等这一系列的操作。当然在编译的时候要注意的是一定要去连接这样的一个sqlite数据库的动态库,否则是编译不过的。
二、使用qt自带的数据库编程的类:
在qt中,提供了一个QtSql这样的一个模块,QtSql这个模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持。QSqlDatabase对象表征了数据库的关联,Qt使用驱动程序与各种数据库的应用编程接口进行通信。QT支持多种数据库,但大部分数据库是收费的,QT提供内置的数据库,那就是SQLITE。
那么如下我们将会使用QT提供的操作接口,来对数据库的操作,代码示例如下:
头文件data.h
#ifndef _DATA_
#define _DATA_
#include <QDialog>
#include <QString>
#include <QSqlQuery>
#include <QSqlDatabase>
#include "ui_data.h"
class Data: public QDialog, public Ui_Data
{
Q_OBJECT
public:
Data(QWidget *parent = 0);
void creatData();
public slots:
void dataInsert();
void dataSelete();
private:
QSqlDatabase db; //内置一个QSqlDatabase对象,通过它来和数据库进行关联
QSqlQuery *query; // QSqlQuery提供了很多可以用来处理数据源的接口
};
#endif
/****************************************************************/
实现文件data.cpp
/****************************************************************/
#include <QDebug>
#include <QSqlError>
#include <QStringList>
#include <QTableWidgetItem>
#include "data.h"
Data::Data(QWidget *parent):QDialog(parent)
{
setupUi(this);
creatData(); //创建数据库文件
connect(pbInsert, SIGNAL(clicked()), this, SLOT(dataInsert()));
connect(pbSelete, SIGNAL(clicked()), this, SLOT(dataSelete()));
connect(pbQuit, SIGNAL(clicked()), this, SLOT(close()));
}
void Data::creatData()
{
//创建一个QSqlDatabase对象,addDatabase函数第一个参数指定了Qt
//必须使用哪一个数据库驱动程序来访问这个数据库
db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("linux");
//设置数据库文件的名字
db.setDatabaseName("database");
//设置用户名
db.setUserName("steve");
//设置密码
db.setPassword("steve");
//打开数据库文件
bool ok = db.open("steve", "steve");
if(ok)
{
qDebug()<<"you are right";
}
//指定db为query的父类
query = new QSqlQuery(db);
//创建一个表
query->exec("CREATE TABLE data (\
ID INTEGER PRIMARY KEY AUTOINCREMENT,\
name VARCHAR(6) NOT NULL,\
score VARCHAR(20) NOT NULL);");
query->clear();
}
void Data::dataInsert()
{
QString name = leName->text();
QString score = leScore->text();
qDebug()<<name<<":"<<score;
/* Prepares the SQL query query for execution. Returns true if the query is prepared successfully; otherwise returns false.*/
//使用prepare()来指定一个包含占位符的查询,
//然后赋值绑定想插入的数据
query->prepare("INSERT INTO data(name, score) VALUES (:name, :score)");
query->bindValue(":name", name.toLocal8Bit().data());
query->bindValue(":score", score.toLocal8Bit().data());
query->exec(); //执行SQL语句
query->clear();
}
void Data::dataSelete()
{
tableWidget->setRowCount(10);
tableWidget->setColumnCount(2);
tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Name"));
tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Score"));
query->exec("SELECT * FROM data");
int i = 1;
int j = 0;
//只要调用next()第一次,就可以把这个QSqlQuery定位到结果集中的第一条记录,
//随后再调用next(),每次都会把记录指针前移一条记录,直到到达结尾时返回false。
while (query->next())
{
//value(i)把字段值作为QVariant返回。
QString name = query->value(i++).toString();
tableWidget->setItem(j, i-2, new QTableWidgetItem(name));
QString score = query->value(i).toString();
tableWidget->setItem(j++, i-1, new QTableWidgetItem(score));
i = 1;
}
query->clear();
}
通过以上的代码,实现的效果如下:
如果想用QtSql模块的话,还必须在pro文件中加入一条语句:QT += sql
以下是有关Qt对数据库操作的一些类:
QSqlDatabase QSqlDriver QSqlQuery QSqlError QSqlQueryModel
QSqlTableModel QSqlRelation QSqlRelationalTableModel
总结:
在用Qt做GUI编程时,如果是对数据库的操作的话,那么可以使用两种方法,但是对Qt本身来说,还是使用Qt自带的QtSql模块来操作还是比较好,通过Qt自己的一些类来操作这些数据库,没有使用linux平台下的那下接口麻烦。
更多技术文章敬请关注:武汉华嵌-嵌入式培训专家,国内领先的嵌入式服务机构,
http://www.embedhq.org