之前使用数据库用的都是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