之前自己用Qt去连接MySQL始终失败,网上的办法我都试过了(花了我一天时间 ,如果哪位大侠解决了,麻烦留言),都没解决,Qt creator只有32位的(官方就没有提供windows 64位的),最新的Qt 5.13 自带mingw 64/32位和vs2017 64/32位编译器,最新的MySQL8.0安装应该是64位的。一直没解决,所以换用SQLITE数据库,用法都一样。
一直报错;
QMYSQL driver not loaded
在使用数据库之前,应注意添加:
QT += sql
一:QSQLITE直接集成在Qt里(应该好多都集成了SQLITE),现在介绍下SQLITE的一些优势。在嵌入式和小工程中是一个不错的选择。当然SQLITE也有自己的数据库可视化管理工具–SQLite Expert,有免费版的:http://www.sqliteexpert.com/download.html 如果你对自己用Qt创建的数据库有疑问,用这个软件查看也是很方便的。
轻型的数据库,设计目标是嵌入式
占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了
支持数据库大小至2TB
SQLite虽然很小巧,但是支持绝大多数的SQL语句
二:如何使用?
1. 如果你没有指定生成数据库的路径,那么默认的位置在编译生成文件的根目录,如果你已经运行了,那么第二次运行时,创建表将会失败,因为表在第一次已经存在
2.1:创建数据库及连接
添加头文件: QSqlDatabase
QSqlDatabase DB = QSqlDatabase::addDatabase("QSQLITE");
qDebug()<<QSqlDatabase::drivers(); //显示你的Qt版本支持什么数据库
qDebug()<<QCoreApplication::libraryPaths(); //库的依赖路径
Qt支持多种数据库,包括QDB2,QIBASE, QMYSQL,QOCI,QODBC, QPSQL, QSQLITE, QSQLITE2, QTDS。你想使用什么数据库,直接修改类型即可。你可以使用上面qDebug()输出相关信息。
DB.setDatabaseName("extrafeartue.db");
添加数据库的名字及路径,见上,我直接给的名字,所以默认路径在编译文件夹的根目录,当然你可以指定一个路径,如绝对路径,相对路径。
需要注意的是:第二次运行的时候可能出错,因为数据库已经存在了,你可以用下面方法解决
1. 最简单的方法,找到手动删除。
2. 在设计是使用DROP DELETE删除,那么在程序结束数据库就删掉了,这样好像不符合预期,程序结束把数据库删了?况且也是不是能让你想删就删的。
3. 加一个条件判断,存在就删除,不存在就创建
4. 创建表的时候获取系统时钟,以系统时钟命令,之后再弄一个脚本,删掉所有.db文件
这里就是设置主机名、端口号、用户名、密码等,QSQLITE不需要这些。
// DB.setHostName("localhost");
// DB.setPort(3306);
// DB.setUserName("root");
// DB.setPassword("123456");
打开数据库即可。
if(!DB.open()){
QMessageBox::warning(this, "错误", "打开数据库失败", QMessageBox::Ok, QMessageBox::NoButton);
return ;
}
2.2:数据库的操作与执行
添加头文件: QSqlQuery
这些基本的操作和你平时使用其他数据库是一样的。
2.2.1:创建表"CREATE TABLE faceDB(id int primary key, name varchar(20), feature TEXT",其中exec()执行结果是ture/false,TEXT是字符串(65535个字符,最大的)
query = QSqlQuery(DB);
//query.exec("SET NAMES 'Latin1'"); //设置支持中文
//主键从1开始依次递增,name是图片名字,feature特征数组,由于比较大512个float,选择TEXT来存储(65535字符,够用了)
qDebug() << "创建表状态" << query.exec("CREATE TABLE faceDB(id int primary key, name varchar(20), feature TEXT)");
2.2.2:插入记录,这里分享是带变量的插入
插入格式:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
1: 你自己预先知道将要插入的数据
query.exec("INSERT INTO faceDB VALUES(0, '00_00.jpg', 'string of feature');
1: 不知道将要插入什么数据
采用prepare方法,先将数据准备好,在依次绑定每个变量值,好像print哈!
//将每次人脸数据相关信息写入数据库--下面是写入变量到数据库的一种方式
query.prepare("INSERT INTO faceDB(id, name, feature) VALUES(:id, :name, :feature)");
query.bindValue(":id", i+1);
query.bindValue(":name", file_name);
query.bindValue(":feature", featurArray);
qDebug() << "插入表状态" << query.exec();
上面是一种典型的方式,其实有两种方式:
方式一: “冒号+参数名”
方式二: “占位符”
query.prepare("INSERT INTO faceDB(id, name, feature) VALUES(?, ?, ?)");
query.bindValue(0, i+1);
query.bindValue(1, file_name);
query.bindValue(2, featurArray);
qDebug() << "插入表状态" << query.exec();
在举个例子
query.prepare("UPDATE employee SET Name=?, Gender=?, Hight=? WHERE EmpNo=?");
query.bindValue(0, "XXX");
query.bindValue(1, ""男);
query.bindValue(2, 1.75);
query.bindValue(3, 1145);
qDebug() << "插入表状态" << query.exec();
2.2.3:显示已经插入的项
方案一:在控制台中循环显示
首先选中,利用next()方法自动到表结尾,利用toxxx()显示
query.exec("SELECT id, name, feature FROM faceDB");
while (query.next()) {
qDebug() << "faceDB(" << query.value(0).toInt()<<") name:" << query.value(1).toString()<<" feature:" << query.value(2).toString();
}
方案二:SQLITE Export打开数据库
装好该软件,打开数据库即可查看
方案三:利用QSqlTableModel显示
用QSqlTableModel显示时,不可以修改表中元素
//QSqlTableModel显示的视图只能显示,不可以修改
QSqlTableModel* model = new QSqlTableModel(this, DB);
model->setTable("faceDB"); //名字要和之前建立的一样哈
model->setEditStrategy(QSqlTableModel::OnManualSubmit); //设置编辑策略
if(!(model->select())){
QMessageBox::critical(this, "错误", "打开数据表错误\n"
+model->lastError().text(), QMessageBox::Ok, QMessageBox::NoButton);
return ;
}
ui->tableView->setModel(model);
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置视图为只读模式