QT中使用MySQL数据库
1.连结MySQL
首先正确安装MySQL数据库。
然后将libmysql.lib文件放在QT安装路径下的对应编译器的lib文件夹下,如F:\software\QT5.9.5\5.9.5\mingw53_32\lib。将libmysql.dll文件放在QT安装路径对应编译器的bin文件夹下。
最后可正常连结使用数据库。
ui->setupUi(this);
QSqlQuery query;
mutex.lock();//互斥锁,可以不用
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","aaa");
//QMYSQL不要变,aaa为连接名,可随意命名,当一个程序有多个地方需要连结数据库时最好使用连接名。
//如使用则下面的query = QSqlQuery("",db)
//不使用则:QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");query = QSqlQuery(db)
db.setHostName("localhost");//主机名
db.setPort(3306);//端口号,一般为3306,若安装数据库时更改则需要做相应的更改
db.setUserName("root");//用户名
db.setPassword("pusong");//密码
db.setDatabaseName("ps");//数据库名,在连结前需要保证数据库中已经创建了该数据库,创建语句:create database ps;
bool flag = db.open();//判断是否成功连结标志
if(flag == true)
{
QMessageBox::information(NULL,"消息提示","成功连接数据库");
}
else
{
//未能成功的错误原因追踪
QMessageBox::critical(NULL,"消息提示","连接数据库失败");
QSqlError error;
error=db.lastError();
if(error.isValid())//发生错误时isValid()返回true
{
switch (error.type())
{
case QSqlError::NoError:
qDebug()<<"无错误";
break;
case QSqlError::ConnectionError://连接错语
qDebug()<<error.text();
break;
case QSqlError::StatementError://语句错语
qDebug()<<error.text();
break;
case QSqlError::TransactionError://事务错误
qDebug()<<error.text();
break;
default://未知错误
qDebug()<<error.text();
break;
}
}
}
mutex.unlock();//互斥锁,前面未用则删除
query = QSqlQuery(db);
2.QSqlQuery
2.1 query.exec("…")
执行sql语句query.exec("…"),主要应用于查询、创建、删除
QString compren = QString("select * from AK;");//全表查询
bool fflag = query.exec(compren);
query.exec("create table motorZuyuan(id int primary key,well int,valve int)");
query.exec("DROP table motorZuyuan");
2.2 query.next()
SqlQuery提供了一个访问一条查询结果记录的方法。在调用了exec()方法之后,QSqlQuery的内部指针定位到了第一条记录之前的位置。我们必须调用一次QSqlQuery::next()内部指针就移动到第一条记录上(第一行),然后重复调用next()方法就可以移动到其他记录上,直到该函数返回false为止。所以一般需要建立while循环。
2.3 query.value(…)
SqlQuery::value()函数返回当前记录的行一个字段值。字段的索引号从0开始计数。QSqlQuery::value()返回一个QVariant,这个类型可以保存各种C++和核心的Qt数据类型,比如int, QString和QByteArray等。不同的数据库类型将自动地映射到最近的Qt等价类型。可以使用toInt,toString,toDouble等转换为自己需要的结果。
while(query.next())
{
qDebug()<<"id"<<query.value("id").toDouble();//该行id列的值
qDebug()<<"frist_one"<<query.value("Ak_num_one").toDouble();//该行AK_num_one列的值
qDebug()<<"second_two"<<query.value("Ak_num_two").toDouble();
qDebug()<<"thrid_three"<<query.value("Ak_num_three").toDouble();
}
2.4 query.prepare("…")
一般用于插入,删除,更新。此函数语句可利用变量操作数据库
bindValue()名称绑定
addBindValue()顺序/位置绑定
QString insert="insert into motorZuyuan"
"(id,well,valve) "
"values(:id,:well,:valve);";
bool insertfalg =query.prepare(insert);//插入操作
if(insertfalg == false)
{
qDebug()<<query.lastError();
}
else
{
qDebug()<<"insert init!";
}
query.bindValue(":id",k);
query.bindValue(":well",-1);
query.bindValue(":valve",-1);
query.exec();
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
3. 可通过命令行运行框查看操作数据库
当某数据库中有表时可使用:desc 表名; 来查看表中的数据
创建表:create table 表名
创建数据库:create database 库名
删除:drop 表名/库名