Qt使用数据库(1)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pp634077956/article/details/51095503

首先在pro文件里面添加.QT += core gui sql

然后创建连接:

bool MainWindow:: connect(const QString &dbName)
{

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
     db.setDatabaseName(dbName);//数据库的名字,这里是Test(注意这里的数据库名字实际上是workbench里面的数据库连接名)
     db.setHostName("127.0.0.1");//ip地址
     db.setUserName("root");//用户的名字
     db.setPassword("19931218");//密码
     db.setPort(3306);
     qDebug()<<"success";

     if (!db.open())
     {
     QMessageBox::critical(0, QObject::tr("Database Error"), db.lastError().text());
     return false;
     }
     return true;
}

由于使用的是MySQL数据库,所以需要指定数据库的名字,登陆的用户名,密码,以及ip地址.adddatabase()函数返回一个数据库连接,由于没有使用connectionname这个参数,系统会自动生成一个名字为defaultConnection的连接.

[1]:然后创建一个QSqlQuery类,注意这里的QSqlQuery实例的创建。我们并没有指定是为哪一个数据库连接创建查询对象,此时,系统会使用默认的连接,也就是使用没有第二个参数的addDatabase()函数创建的那个连接(其实就是名字为QSqlDatabase::defaultConnection的默认连接)。如果没有这么一个连接,系统就会报错。也就是说,如果没有默认连接,我们在创建QSqlQuery对象时必须指明是哪一个QSqlDatabase对象,也就是addDatabase()的返回值。

利用这个类创建表单以及插入数据,读取数据.因为表单不能重复创建,所以在创建之前我们先删除表单,然后再创建.其中使用了addBindValue来绑定,替换站占位符.

#include "mainwindow.h"
#include"QSqlQuery"
#include "QSqlError"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    if ( w.connect("test"))
    {
     QSqlQuery query;
     qDebug()<<"hhhh" ;
     //query.exec("TRUNCATE TABLE");
     query.exec("DROP TABLE student");
     if (!query.exec("CREATE TABLE student ("
     "ID CHAR(10) not null,"
     "name CHAR(100) not null,"
     "age CHAR(10) not null"
                     ");"))
     {
      QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text());
      return 1;
     }
     else
         qDebug()<<"success";

     query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
     QVariantList names;
     names << "Tom" << "Jack" << "Jane" << "Jerry";
     query.addBindValue(names);
     QVariantList ages;
     ages << 20 << 23 << 22 << 25;
     query.addBindValue(ages);
    if (!query.execBatch())
     {
         QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text());
     }

     query.finish();
     qDebug()<<"hhhh" ;

     query.exec("SELECT name, age FROM student");
     while (query.next())
      {
        qDebug()<<"start11";

      QString name = query.value(0).toString();
      int age = query.value(1).toInt();
      int Id = query.value(2).toInt();
      qDebug() << name << ": " << age<<Id;
      }
}
     return a.exec();
}

============= 我是分割线==================

QSqlQuery类功能强大,可以执行各种sql语句,但是稍显麻烦,QSqlTableModel则是一个更高级的模型,它足以应付大多数的sql需求.

  QSqlTableModel model;
        model.setTable("student");//关联到这个student表
        model.setFilter("age > 20 and age < 25");//相当于设置where语句
        if(model.select())
        {
            for(int i = 0;i!=model.rowCount();++i)
            {
                   QSqlRecord record = model.record(i);//获取第一行的结果
                   QString name = record.value("name").toString();
                   size_t age = record.value("age").toInt();
                   qDebug()<<"name: "<<name<<"age: "<<age;

            }

和QSqlQuery类一样,如果在创建model的时候没有指定连接,就会自动关联到默认的连接上去,没有这个默认连接就会报错.注意,model的select不能选择某些列,只能全部选择.

[3]接下来是插入语句:

  int row = 0; model.insertRows(row, 1); //在position row 插入 count empty rows
        model.setData(model.index(row, 1), "Cheng");//在这一行设置数据
        model.setData(model.index(row, 2), 24);//同上
        model.submitAll();

相当于INSERT INTO student (name, age) VALUES (‘Cheng’, 24) .

[4]更新数据表:

if (model.select())
 { 
if (model.rowCount() == 1) 
{
 model.setData(model.index(0, 2), 26);
  model.submitAll(); 
  }
 }

[5]删除数据表:

QSqlTableModel model; 
model.setTable("student");
 model.setFilter("age = 25");
  if (model.select()) { 
  if (model.rowCount() == 1) 
  { model.removeRows(0, 1); //Removes count rows starting at row. 
  model.submitAll();
   }
   }
展开阅读全文

没有更多推荐了,返回首页