由于本人的课题原因,需要用到Qt进行应用程序设计以及数据库完成远程数据的上传和交互,因此最近对于Qt及其与微软MSSQL数据库的连接以及操作进行了学习,大量借鉴了网络资料其中自认为比较有价值的几篇日后可用于复习的内容有:
#include //数据库类
#include //报错引用及sql功能类
//定义一个数据库 并设置数据库驱动为ODBC
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
//将服务器名称、登录用户名、密码、使用数据库名称填入变量中以便使用
QString hostName = "DESKTOP-I0HQ4N4";//服务器名称
QString username = "sa";//登录名
QString password = "gkd123123";//密码
QString databaseName = "bd12345678";//数据库名称
//将上述信息按要求连接
QString dsn = QStringLiteral("DRIVER={SQL Server};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4").arg(hostName).arg(databaseName).arg(username).arg(password);
//将连接信息填充至自定义的数据库中
db.setDatabaseName(dsn);
//打开数据库
db.open();//有返回值为bool类型 用于判断数据库打开成功与否 返回值为true则成功,可用以下方式进行检测(使用前要包含debug和messagebox的类)
if(!db.open())
{
qDebug()<<db.lastError().text();
QMessageBox::critical(0, QObject::tr("Database error"), db.lastError().text());
}
else
{
qDebug()<<"database open success!";
}
数据库连接成功可以说万里长征已经走完了接近一半,由于对数据库了解甚少所以十分艰难。在搞定数据库连接之后就是对数据库内某一表内容的增、删、读、改,这里同样提供一篇自认为思路和结构比较值得学习的文章:
https://blog.csdn.net/qq_34510308/article/details/78145131?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&utm_relevant_index=1
增删改查基本都是利用sql语句进行而且比较直观,文中的这种书写方式拓展性较强,也是我所采用的方式。下面是我建立的四个按钮btn_addValue、btn_changeValue、btn_deletValue、btn_outputValue所绑定的对应数据库操作代码仅供参考:
//在数据库最后一行进行数据插入
connect(ui->btn_addValue,&QPushButton::clicked,[=](){
static int i = 10;
QSqlQuery query(db);
query.prepare("INSERT INTO Table_text(physicalState,virtualState,id)""VALUES(:physicalState,:virtualState,:id)");//INSERT INTO 是sql语句作用就是增加数据,Table_text是本次测试使用的数据库表,physicalState,virtualState和id是表中的列名
query.bindValue(":physicalState",4);
query.bindValue(":virtualState",2);
query.bindValue(":id",i++);//写id这一列的原因是防止出现数据完全一致的行
int success=query.exec();//通过.exec()的返回值判断操作是否成功
if(!success)
{
QMessageBox::information(NULL, "err", tr("数据库错误: %1").arg(query.lastError().text()), QMessageBox::Yes, QMessageBox::Yes);
qDebug()<<"fail";
}
else
{
qDebug()<<"succeed";
}
});
//表中任意位置数据修改
connect(ui->btn_changeValue,&QPushButton::clicked,[=](){
QSqlQuery query(db);
query.prepare("update Table_text set physicalState=?, =? where id=?";//update是sql指令功能是表中数据更新 最后一句id=?是修改位置寻址 可以以表中任一一列中的数据进行寻址,但是会删除相同的寻址行,也就是如果有两行id都是我要删除的数字那么这两行都会被删除。
query.addBindValue(4);//绑定上一句prepare中的第一个问号表示的变量physicalState
query.addBindValue(3); //绑定上一句prepare中的第二个问号表示的变量virtualState
query.addBindValue(4); //绑定上一句prepare中的第三个问号表示的变量id
//综合看来我一上的语句功能为将id为4的行physicalState列值改为4,virtualState列值改为3注意两边使用的数据结构要相同。
int success = query.exec();
if(!success)
{
QMessageBox::information(NULL, "err", tr("数据库错误: %1").arg(query.lastError().text()), QMessageBox::Yes, QMessageBox::Yes);
qDebug()<<"fail";
}
else
{
qDebug()<<"succeed";
}
});
//表中某一行内容删除
connect(ui->btn_deletValue,&QPushButton::clicked,[=](){
QSqlQuery query(db);
query.prepare(QString("DELETE FROM Table_text WHERE id=?"));//delete from是sql删除语句 后面的id = 是要删除行的寻址
query.addBindValue(10);
//上述指令的功能为删除表中id列为10的行
int success =query.exec();
if(!success)
{
QMessageBox::information(NULL, "err", tr("数据库错误: %1").arg(query.lastError().text()), QMessageBox::Yes, QMessageBox::Yes);
qDebug()<<"fail";
}
else
{
qDebug()<<"succeed";
}
});
//数据库 表内容查询
connect(ui->btn_outputValue,&QPushButton::clicked,[=](){
QSqlQuery query(db);
query.exec("select * from Table_text");// select * from是sql查询语句
while(query.next())//当.next返回值为bool类型 结果定位在最后一条记录之后,才返回false说明查询已到达标底默认从表顶部开始,查询时可以用.first() .last()定位顶部和底部 .seek(n) 可以直接查询第n+1行内容
{
qDebug()<<query.value(0).toInt()<<query.value(1).toInt();
}
qDebug()<<"completed";
});