【Qt】mysql数据库

一些参考:非常齐全的QT数据库操作详解

之前用的数据库一直是SQL Server,这次用了mysql感官上还是很不同的。主要是修改表之后要点击apply应用,这个时候mysql会把你的认为修改变成语句。然后因为全英文的我还没找到有些奇怪的设置在哪里,比如自动增长,只能用语句实现。

 

连接数据库

  1. .pro文件中加上 QT += sql
  2. 头文件 #include
  3. 具体语句
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QMYSQL");  //添加MYSQL的数据库驱动

    db.setHostName("localhost");         //主机名,写IP“127.0.0.1”也行
    db.setPort(3306);                    //mysql端口,固定的

    db.setDatabaseName("rankingList");          //数据库名
    db.setUserName("root");              //用户名
    db.setPassword("123456");            //密码
    db.open();                           //打开数据库,返回值bool

 如果连接数据库有问题参考一下 参考

 

操作数据库

  1. 头文件 #include
  2. 具体语句

简单执行一条指令:

    QSqlQuery q1;
    q1.exec("insert into student values(5, 'Kitty',26);");
    q1.exec("insert into student values(8, \"Titi\",26);");     //里面写引号要加反斜杠

    QString str = QString("insert into student values(%1, '%2', %3);").arg(ui->lineEdit->text().toInt()).arg(ui->lineEdit_2->text()).arg(ui->lineEdit_3->text().toInt());
    q1.exec(str);

    q1.exec("INSERT INTO "+table+" (name,date) VALUES('"+name+"','"+current_time+"')");    //用"+ +"包含的都是程序中的变量

 批量插入:

    QSqlQuery q3;
    //1.预处理语句
    q3.prepare("insert into student values(:id,:name,:score);");
    //2.新建字段
    QVariantList idlist;
    idlist << 10 << 11 << 12;
    QVariantList namelist;
    namelist << "Alex" << "Aileen" << "Kun";
    QVariantList scorelist;
    scorelist << 98 << 97 << 77;
    //3.绑定字段和语句
    q3.bindValue(":id", idlist);
    q3.bindValue(":name", namelist);
    q3.bindValue(":score", scorelist);
    //4.执行操作语句
    q3.execBatch();

获取执行结果:

    QSqlQuery q4;
    q4.exec("select * from student where score > 90;");
    while(q4.next())
    {
        qDebug() << q4.value(0).toInt();    //括号里的数字代表第几列
        qDebug() << q4.value(1).toString();
        qDebug() << q4.value(2).toInt();
    }

 



一些笔记


自动增长:

AUTO_INCREMENT
alter table  `rankinglist`.`easy` auto_increment = 1;
例:
CREATE TABLE `rankinglist`.`middle` (
  `no` INT NOT NULL AUTO_INCREMENT, 
  `name` VARCHAR(45) NULL,
  `seconds` INT NULL,
  `date` DATETIME NULL,
  PRIMARY KEY (`no`));
alter table  `rankinglist`.`middle` auto_increment = 1;

 

插入:

QString s = "INSERT INTO `rankinglist`.`easy` (name, seconds) VALUES ('Aileen', 265)";
QSqlQuery query;
query.exec(s);

 

datetime类型时间获取并插入:

QDateTime current_date_time = QDateTime::currentDateTime();
QString current_time = current_date_time.toString("yyyy-MM-dd hh:mm:ss");
QSqlQuery query;
query.exec("INSERT INTO `rankinglist`.`easy` (name, seconds,date) VALUES ('Aileen', 265,'"+current_time+"')");

 

从数据库按时间长短提取前五名用时最少的数据:

query.exec("select * from `rankinglist`.`easy` order by seconds asc limit 5");
int i = 0;
    while(query.next())
    {
        i++;
        QString name = query.value(1).toString();
        int seconds = query.value(2).toInt();
        int second = seconds % 60;
        int minute = seconds / 60;
        QString time;
        time.sprintf("%d分%d秒",minute,second);
        QString date = query.value(3).toString();
    }

从数据库随机读取数据

SELECT * FROM table ORDER BY RAND() LIMIT N;

N是要取几条

 

update语句明明用的是正确的,但出现错误:

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.


意思是:这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,执行命令SET SQL_SAFE_UPDATES = 0,修改下数据库模式
还有update语句后面不用加table直接加表的名字


有个未解决的问题:当在sql语句中添加整形变量并用"++"包围的时候它会提示将整形转换成char型会丢失数据?可是我没想转换成char型而且查了网上变量就是这么用的。。。不知道为什么的很郁闷
 

你可能感兴趣的:(Qt)