QT学习之路————C语言操作sqlite数据库

前言:

首先在这里并不是用QT自带的QSqlDatabase类来操作数据库,而是用纯C语言操作,因为QT是支持C/C++混合编程的,若想看QSqlDatabase类操作数据库,请查看我的博客。
一、新建个QT工程
二、在.Pro文件里添加sqlite3库文件链接
LIBS     += -lsqlite3
三、在.cpp文件中添加头文件
#include <sqlite3.h>
#include "pack_firehost.h" //这是我的一个结构体定义的头文件,因为我是要操作结构体的,所以添加
四、在main.cpp里转换编码类型(PS:我要操作中文,若只有英文或者数字,可以不修改编码类型)
QTextCodec *codec = QTextCodec::codecForName("GB2312");
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);

五、下面是我.cpp文件的代码,懒得一步一步介绍了,挺简单的

#include "dialog.h"
#include "ui_dialog.h"
#include <sqlite3.h>
#include <stdio.h>
#include "pack_firehost.h"
sqlite3  *s_report_db = NULL;
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    int                      rv;
    int                      i=0;
    sqlite3_stmt             *stat = NULL;
    const void               *blob_ptr;
    firehost_pack_t          *pack;
    firehost_pack_t          pk;
    QString                  time;
    pack=&pk;
    open_db();//打开数据库,函数的定义在下面

    if(!s_report_db)
    {
        printf("report database not opened, try to open it now\n");
        return;
    }
    rv = sqlite3_prepare_v2(s_report_db, "select id,packet from firehost;", -1, &stat, NULL);	//解析SQL语句,并存入stat中
    if(SQLITE_OK!=rv || !stat)
    {
        printf("firehost sqlite3_prepare_v2 failure\n");
        return;
    }
    sqlite3_step(stat);		//执行上面所解析的SQL语句,并返回第一条查询记录,并存在stat中
    blob_ptr = sqlite3_column_blob(stat, 1);	//从记录中获取第二个字段,我的是个结构体,所以用sqlite3_column_blob,如果是其他类型,得用相应的函数
    memcpy(pack, blob_ptr, sizeof(*pack));
    ui->evnet->setText(QString::number(pack->event));

    for(i=0;i<6;i++)
    {
        if(i==0)
            time=time+QString::number(pack->time[i],16)+"年";
        if(i==1)
            time=time+QString::number(pack->time[i],16)+"月";
        if(i==2)
            time=time+QString::number(pack->time[i],16)+"日";
        if(i==3)
            time=time+QString::number(pack->time[i],16)+"点";
        if(i==4)
            time=time+QString::number(pack->time[i],16)+"分";
        if(i==5)
            time=time+QString::number(pack->time[i],16)+"秒";
        printf("time[%d]=%x\n",i,pack->time[i]);
    }
    ui->time->setText(time);
    ui->addr->setText(pack->pos_desc);
    sqlite3_finalize(stat);		//释放stat
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::open_db()
{
    const char        *db_file = "./uited_report.db";
/*确定文件或文件夹的访问权限,成功执行返回0:
F_OK 判断文件是否存在;
R_OK 只判断是否有读权限;
W_OK 只判断是否有写权限;
X_OK 判断是否有执行权限
*/
    if( 0==access(db_file, F_OK) )		//判断文件是否存在
    {
        if( SQLITE_OK != sqlite3_open(db_file, &s_report_db) )      	//打开数据库
        {
            printf("open report database file '%s' failure\n", db_file);
            return ;
        }
        printf("open report database file '%s' ok\n", db_file);
    }
   else
  {
	printf("fille not exist!\n");
	return;
   }
}


猜你喜欢

转载自blog.csdn.net/huangan_xixi/article/details/51955741