【Qt】数据库(一)SQLITE创建、增删查改

打印 上一主题 下一主题

主题 1008|帖子 1008|积分 3024

填坑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;

引入头文件
  1. #include <QSqlDatabase>   //创建数据库
  2. #include <QSqlError>
  3. #include <QSqlQuery>      //针对数据库进行一些操作
  4. #include <QMessageBox>    //提示弹窗,这个可以不加
复制代码
Step2:创建(配置)和关闭

2.1 创建(打开)数据库

在类中创建一个bool型的函数,创建并配置一个数据库
  1. bool MainWindow::createConnection()//创建并配置数据库
  2. {
  3.     //建立了一个QSqlDatabase对象,后续的操作要使用这个对象
  4.     QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");//Sqlite数据库
  5.     database.setHostName("127.0.0.1");//连接地址
  6.     database.setDatabaseName("MyDataBase_sqlite.db");//命名数据库
  7.     database.setUserName("ShengQiang");//用户名
  8.     database.setPassword("123456");//密码
  9.     if (!database.open()) {//如果数据库连接失败,则弹出
  10.         QMessageBox::critical(0, "Cannot open database",
  11.                               "Unable to establish a database connection", QMessageBox::Cancel);
  12.         return false;
  13.     }
  14.     else{//如果数据库连接成功,则弹出
  15.         QMessageBox::information(0, "Succeed", "Good Luck!",QMessageBox::Ok);
  16.     }
  17.     return true;
  18. }
复制代码
通常我们必要不停判断数据库是否已创建,而不是不停创建一个数据库,以是我们可以通过if判断数据库是否已经创建了。

2.2 关闭数据库

数据库操作完成后,最好关闭。下次用到了再重新打开。
  1. database.close();//database是自己创建的数据库变量
复制代码
Step3:操作(增删查改)

3.1 创建表格

创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。
  1. QSqlQuery sql_query;
  2. QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
  3. sql_query.prepare(create_sql);
  4. if(!sql_query.exec())
  5. {
  6.     qDebug() << "Error: Fail to create table." << sql_query.lastError();
  7. }
  8. else
  9. {
  10.     qDebug() << "Table created!";
  11. }
复制代码
代码表明:
(1)第一行界说一个QSqlQuery对象。
(2)第二行是一个QString,其中的内容是SQLite语句。对数据库的操作,都是用SQLite的语句完成的,把这些指令以QString类型,通过prepare函数,保存在QSqlQuery对象中。也可将指令,以QString情势直接写在exec()函数的参数中,比方:
  1. 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 增

在刚才创建的表格中,插入一行数据。
  1.     database.open();
  2.     QSqlQuery sql_query;
  3.     //在插入数据时,不需要手动指定id字段的值,因为SQLite会为您自动生成。您只需要绑定其他字段的值
  4.     QString insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)";
  5.     sql_query.prepare(insert_sql);
  6.     //sql_query.addBindValue(10);
  7.     sql_query.addBindValue("Wang");
  8.     sql_query.addBindValue(25);
  9.     if(!sql_query.exec())
  10.     {
  11.         qDebug() << sql_query.lastError();
  12.     }
  13.     else
  14.     {
  15.         qDebug() << "inserted Wang!";
  16.     }
  17.     //第二种插入方法
  18. //    if(!sql_query.exec("INSERT INTO student VALUES(9, "Li", 23)"))
  19. //    {
  20. //        qDebug() << sql_query.lastError();
  21. //    }
  22. //    else
  23. //    {
  24. //        qDebug() << "inserted Li!";
  25. //    }
  26.     //    database.close();
复制代码
插入语句:insert into <table_name> values (value1, value2,…);
insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的次序与addBindValue调用的次序相同。插入第二组数据的时候,则是直接写出完备语句。
3.3 改

例3:更新数据(修改数据)

  1. QString update_sql = "update student set name = :name where id = :id";
  2. sql_query.prepare(update_sql);
  3. sql_query.bindValue(":name", "Qt");
  4. sql_query.bindValue(":id", 1);
  5. if(!sql_query.exec())
  6. {
  7.     qDebug() << sql_query.lastError();
  8. }
  9. else
  10. {
  11.     qDebug() << "updated!";
  12. }
复制代码
语句:update <table_name> set <f1=value1>, <f2=value2>… where ;
更新(修改)的语句是update…set…,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。
bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。
3.4 查

3.4.1 查部分数据
  1. QString select_sql = "select id, name from student";
  2. if(!sql_query.exec(select_sql))
  3. {
  4.     qDebug()<<sql_query.lastError();
  5. }
  6. else
  7. {
  8.     while(sql_query.next())
  9.         {
  10.             int id = sql_query.value(0).toInt();
  11.             QString name = sql_query.value(1).toString();
  12.             qDebug()<<QString("id:%1    name:%2").arg(id).arg(name);
  13.         }
  14. }
复制代码
语句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 查全部数据
  1. QString select_all_sql = "select * from student";
  2. sql_query.prepare(select_all_sql);
  3. if(!sql_query.exec())
  4. {
  5.     qDebug()<<sql_query.lastError();
  6. }
  7. else
  8. {
  9.     while(sql_query.next())
  10.         {
  11.             int id = sql_query.value(0).toInt();
  12.             QString name = sql_query.value(1).toString();
  13.             int age = sql_query.value(2).toInt();
  14.             qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
  15.         }
  16. }
复制代码
语句select * from <table_name>;
查询所有数据用 * 表现。用while(sql_query.next())用来遍历所有行。同样用value()得到数据。
3.4.3 查询最大id
  1. QString select_max_sql = "select max(id) from student";
  2. int max_id = 0;
  3. sql_query.prepare(select_max_sql);
  4. if(!sql_query.exec())
  5. {
  6.     qDebug() << sql_query.lastError();
  7. }
  8. else
  9. {
  10.     while(sql_query.next())
  11.         {
  12.             max_id = sql_query.value(0).toInt();
  13.             qDebug() << QString("max id:%1").arg(max_id);
  14.         }
  15. }
复制代码
3.5 删

3.5.1 删除一条数据
  1. QString delete_sql = "delete from student where id = ?";
  2. sql_query.prepare(delete_sql);
  3. sql_query.addBindValue(0);
  4. if(!sql_query.exec())
  5. {
  6.     qDebug()<<sql_query.lastError();
  7. }
  8. else
  9. {
  10.     qDebug()<<"deleted!";
  11. }
复制代码
语句delete from <table_name> where =
delete用于删除条目,用where给出限定条件。比方此处是删除 id = 0的条目。
3.5.2 清空表格(删除所有)
  1. QString clear_sql = "delete from student";
  2. sql_query.prepare(clear_sql);
  3. if(!sql_query.exec())
  4. {
  5.     qDebug() << sql_query.lastError();
  6. }
  7. else
  8. {
  9.     qDebug() << "table cleared";
  10. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表