填坑1:如何连续插入
汇总SQlite语句
创建表格:create table <table_name> (f1 type1, f2 type2,…);
增:insert into <table_name> values (value1, value2,…);
改:update <table_name> set <f1=value1>, <f2=value2>… where ;
查:select , , … from <table_name>;
删:delete from <table_name> where =
删全部:delete from <table_name>
Step1:准备工作
创建项目
在qmake中(.pro文件)引入依赖:QT += sql
;
引入头文件
#include <QSqlDatabase> //创建数据库
#include <QSqlError>
#include <QSqlQuery> //针对数据库进行一些操作
#include <QMessageBox> //提示弹窗,这个可以不加
Step2:创建(配置)和关闭
2.1 创建(打开)数据库
在类中创建一个bool型的函数,创建并配置一个数据库
bool MainWindow::createConnection()//创建并配置数据库
{//建立了一个QSqlDatabase对象,后续的操作要使用这个对象QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");//Sqlite数据库database.setHostName("127.0.0.1");//连接地址database.setDatabaseName("MyDataBase_sqlite.db");//命名数据库database.setUserName("ShengQiang");//用户名database.setPassword("123456");//密码if (!database.open()) {//如果数据库连接失败,则弹出QMessageBox::critical(0, "Cannot open database","Unable to establish a database connection", QMessageBox::Cancel);return false;}else{//如果数据库连接成功,则弹出QMessageBox::information(0, "Succeed", "Good Luck!",QMessageBox::Ok);}return true;
}
通常我们需要不断判断数据库是否已创建,而不是一直创建一个数据库,所以我们可以通过if判断数据库是否已经创建了。
2.2 关闭数据库
数据库操作完成后,最好关闭。下次用到了再重新打开。
database.close();//database是自己创建的数据库变量
Step3:操作(增删查改)
3.1 创建表格
创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。
QSqlQuery sql_query;
QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{qDebug() << "Error: Fail to create table." << sql_query.lastError();
}
else
{qDebug() << "Table created!";
}
代码解释:
(1)第一行定义一个QSqlQuery对象。
(2)第二行是一个QString,其中的内容是SQLite语句。对数据库的操作,都是用SQLite的语句完成的,把这些指令以QString类型,通过prepare函数,保存在QSqlQuery对象中。也可将指令,以QString形式直接写在exec()函数的参数中,例如:
sql_query.exec("create table student (id int primary key, name varchar(30), age int)");
创建表格语句:create table <table_name> (f1 type1, f2 type2,…);
create table是创建表格的语句,也可用大写CREATE TABLE;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是id,这一列储存的数据类型是int,第二列名称是name,数据类型是字符数组,最多有30个字符(和char(30)的区别在于,varchar的实际长度是变化的,而char的长度始终是给定的值),第三列的名称是age,数据类型是int。
如果sql_query.exec()执行成功,则创建表格成功。
3.2 增
在刚才创建的表格中,插入一行数据。
database.open();QSqlQuery sql_query;//在插入数据时,不需要手动指定id字段的值,因为SQLite会为您自动生成。您只需要绑定其他字段的值QString insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)";sql_query.prepare(insert_sql);//sql_query.addBindValue(10);sql_query.addBindValue("Wang");sql_query.addBindValue(25);if(!sql_query.exec()){qDebug() << sql_query.lastError();}else{qDebug() << "inserted Wang!";}//第二种插入方法
// if(!sql_query.exec("INSERT INTO student VALUES(9, \"Li\", 23)"))
// {
// qDebug() << sql_query.lastError();
// }
// else
// {
// qDebug() << "inserted Li!";
// }// database.close();
插入语句:insert into <table_name> values (value1, value2,…);
insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候,则是直接写出完整语句。
3.3 改
例3:更新数据(修改数据)
QString update_sql = "update student set name = :name where id = :id";
sql_query.prepare(update_sql);
sql_query.bindValue(":name", "Qt");
sql_query.bindValue(":id", 1);
if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}
else
{qDebug() << "updated!";
}
语句:update <table_name> set <f1=value1>, <f2=value2>… where ;
更新(修改)的语句是update…set…,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。
bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。
3.4 查
3.4.1 查部分数据
QString select_sql = "select id, name from student";
if(!sql_query.exec(select_sql))
{qDebug()<<sql_query.lastError();
}
else
{while(sql_query.next()){int id = sql_query.value(0).toInt();QString name = sql_query.value(1).toString();qDebug()<<QString("id:%1 name:%2").arg(id).arg(name);}
}
语句select , , … from <table_name>;
select是查询指令; 等等是要查询的变量(即表头),中间用逗号隔开;from …指定表格。
上述语句是说查询student表中的 id 和 name 。执行查询之后,用sql_query.value(int)来获得数据。同样地,value(0)表示第一个数据,即 id,value(1)表示name。注意:value()函数的返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。
3.4.2 查全部数据
QString select_all_sql = "select * from student";
sql_query.prepare(select_all_sql);
if(!sql_query.exec())
{qDebug()<<sql_query.lastError();
}
else
{while(sql_query.next()){int id = sql_query.value(0).toInt();QString name = sql_query.value(1).toString();int age = sql_query.value(2).toInt();qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);}
}
语句select * from <table_name>;
查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。
3.4.3 查询最大id
QString select_max_sql = "select max(id) from student";
int max_id = 0;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}
else
{while(sql_query.next()){max_id = sql_query.value(0).toInt();qDebug() << QString("max id:%1").arg(max_id);}
}
3.5 删
3.5.1 删除一条数据
QString delete_sql = "delete from student where id = ?";
sql_query.prepare(delete_sql);
sql_query.addBindValue(0);
if(!sql_query.exec())
{qDebug()<<sql_query.lastError();
}
else
{qDebug()<<"deleted!";
}
语句delete from <table_name> where =
delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。
3.5.2 清空表格(删除所有)
QString clear_sql = "delete from student";
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{qDebug() << sql_query.lastError();
}
else
{qDebug() << "table cleared";
}