zoukankan      html  css  js  c++  java
  • Linux平台QT数据库编程(来自网络)

     

    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 ",sqlite3_errmsg(db));

                       sqlite3_close(db);

                       exit(-1);

             }

             else

             {

                       printf("you are right ");

             }

            

             //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平台下的那下接口麻烦。

     
  • 相关阅读:
    浅谈LBS(基于位置的服务)
    MapBar地图更新啦
    推荐一款软件:Global Mapper
    51ditu、清华地图以及Google地图
    极索(Gsuo)推出新版地图采用Gmap设计思路
    公告:Rover's Official Blog停止更新
    最后的礼物:校园多媒体系统和校园WEBGIS系统
    JAVA中最常用的十个快捷键
    启程去旅行 android之merge布局 http://www.cnblogs.com/travelfromandroid/articles/2133206.html
    Http 范例
  • 原文地址:https://www.cnblogs.com/tuotuteng/p/3912063.html
Copyright © 2011-2022 走看看