一些参考:非常齐全的QT数据库操作详解
之前用的数据库一直是SQL Server,这次用了mysql感官上还是很不同的。主要是修改表之后要点击apply应用,这个时候mysql会把你的认为修改变成语句。然后因为全英文的我还没找到有些奇怪的设置在哪里,比如自动增长,只能用语句实现。
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
如果连接数据库有问题参考一下 参考
简单执行一条指令:
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);
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是要取几条
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型而且查了网上变量就是这么用的。。。不知道为什么的很郁闷