Qt使用sqlite数据库的问题

之前使用数据库用的都是MySQL,觉得挺方便的,但最近做的程序要在Linux开发板上跑,就使用了Qt自带的轻量级数据库sqlite,但使用过程中遇到了一些问题:

原代码(只贴相关代码):

头文件:

#include <QSqlDatabase> 
QSqlDatabase db; 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void DatabaseConnect();

源文件:

void frmMain::DatabaseConnect()
{    //需要进行判断默认的连接名是否存在,
    //如果不存在才使用addDatabase()方法,如果存在则使用database()方法
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
        db = QSqlDatabase::addDatabase("QSQLITE");
    //连接数据库
    db.setHostName("127.0.0.1"); //数据库服务器IP
    db.setUserName("ente");//用户名
    db.setPassword("000000");//密码
    db.setDatabaseName("ente.db");//使用的数据库,如果不存在,会自动创建
    if(!db.open())
    {
        QMessageBox::warning(this,"Error","Details:DB Open Error!");
    }
    QSqlQuery query;
    QString connectDB = QString("create table entedata (num int primary key auto_increment,time timestamp,ion int,temperature int,humidity int)");
    //新建数据表
    if(!query.exec(connectDB))//数据表创建失败
        {
        QSqlError lastError = query.lastError();
        QMessageBox::warning(this,"数据表创建失败","Details:"+lastError.driverText());
        return;
        } 
}

程序运行后弹出对话框提示:数据库创建失败
然后我打开文件夹,发现有一个空的ente.db文件,说明数据库打开是成功的,我以为是我的SQL语句有问题,对照着一些参考书进行比对,还将这个SQL语句放在MySQL命令行中执行,执行成功!
在大牛的帮助下,对代码进行修改,终于成功:

更改后的代码(只贴相关代码)

头文件同源代码
源文件:

void frmMain::DatabaseConnect()
{    //需要进行判断默认的连接名是否存在,
    //如果不存在才使用addDatabase()方法,如果存在则使用database()方法
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        db = QSqlDatabase::database("qt_sql_default_connection");
    else
        db = QSqlDatabase::addDatabase("QSQLITE");
    //连接数据库
    db.setHostName("127.0.0.1"); //数据库服务器IP
    db.setUserName("ente");//用户名
    db.setPassword("000000");//密码
    db.setDatabaseName("ente.db");//使用的数据库
    if(!db.open())
    {
        //QSqlError lastError = query.lastError();
        QMessageBox::warning(this,"Error","Details:DB Open Error!");
    }
    QSqlQuery query; 
    //判断数据表是否存在,不存在则创建
    if(!query.exec("select * from entedata"))
    {
    QString connectDB = QString("create table entedata(num integer primary key autoincrement,time timestamp,ion integer,temperature integer,humidity integer)");
    //创建数据表
    if(!query.exec(connectDB))//数据表创建失败
        {
        QSqlError lastError = query.lastError();
        QMessageBox::warning(this,"数据表创建失败","Details:"+lastError.driverText());
        return;
        }
    } 
    }

改动点主要在SQL语句:
改动前:

create table entedata (num int primary key auto_increment,time timestamp,ion int,temperature int,humidity int)

改动后:

create table entedata(num integer primary key autoincrement,time timestamp,ion integer,temperature integer,humidity integer)

错误原因:

1、sqlite中,自动增长是autoincrement而不是auto_increment ,这里与MySQL不同;
2、sqlite中,int 单独做数据类型没问题,做主键也没问题,做主键并且需要autoincrement 属性的话就得是
integer primary key autoincrement

猜你喜欢

转载自blog.csdn.net/qq_40194498/article/details/80015552