目录
1.前言
最近使用QT进行数据库的操作,因此学习了一些数据库的知识,学习了如何在QT中连接数据库,创建表,操作表。我在网上了解三种方法,分别是SQLite,MySQL和ODBC。连接之前需要在QT的 .pro 中添加QT += sql。
2.QT连接SQLite
SQLite是一种嵌入式关系型数据库管理系统(RDBMS),它提供了一个轻量级、独立的、零配置的数据库引擎。SQLite的设计目标是为了在资源受限的环境中提供高效、可靠的数据库功能。
SQLite适用于小型项目、原型开发、移动应用程序以及需要在嵌入式环境中使用数据库的场景。它提供了简单、快速、可靠的数据存储和检索功能,并且由于其便捷性和可移植性而受到广泛使用。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 建立和QSQLITE数据库的连接
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setUserName("root");
//设置数据库的密码
db.setPassword("12345678"); //这个就是安装MySQL时设置的密码
db.setDatabaseName("deviceattribute");//设置数据库名称
if(db.open())
{
qDebug() << "QSLite数据库连接成功!";
}
else
{
qDebug() << "QSLite数据库连接失败!";
}
}
3.QT连接MySQL
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),被用于存储和管理大量结构化数据。它是一套客户端-服务器模型的数据库软件,提供了可靠、高效和可扩展的数据管理解决方案。
QT连接MySQL之前还需要在QT中配置,我是在参考网上其他博主配置过程,很幸运成功了,具体可以参考其他博主配置过程。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");// 建立和QMYSQL数据库的连接
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setUserName("root");
//设置数据库的密码
db.setPassword("12345678"); //这个就是安装MySQL时设置的密码
db.setDatabaseName("deviceattribute");//设置数据库名称
if(db.open())
{
qDebug() << "MySql数据库连接成功!";
}
else
{
qDebug() << "MySql数据库连接失败!";
}
}
4.QT连接ODBC
ODBC(Open Database Connectivity)是一种应用程序编程接口(API),用于在不同的数据库管理系统(DBMS)之间建立连接和进行交互。它提供了一种标准化的方式,使得应用程序可以通过统一的接口访问和操作多种不同类型的数据库。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");// 建立和QMYSQL数据库的连接
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setUserName("root");
//设置数据库的密码
db.setPassword("12345678"); //这个就是安装MySQL时设置的密码
db.setDatabaseName("deviceattribute");//设置数据库名称
if(db.open())
{
qDebug() << "ODBC连接数据库成功!";
}
else
{
qDebug() << "ODBC连接数据库失败!";
}
}
后面我又发现ODBC也可以通过下面的方式连接数据库,这种方式使用了MySQL的ODBC驱动程序(MySQL ODBC 8.1 ANSI Driver)来连接到MySQL数据库,后面是连接参数。
#include "data.h"
#include "ui_data.h"
Data::Data(QWidget *parent) :
QWidget(parent),
ui(new Ui::Data)
{
ui->setupUi(this);
// 添加ODBC数据库驱动程序
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={MySQL ODBC 8.1 ANSI Driver};SERVER=127.0.0.1;PORT=3306;DATABASE=deviceattribute;USER=root;PASSWORD=12345678");
// 尝试连接数据库
if (!db.open())
{
QMessageBox::information(this,"Tip","连接失败");
qDebug() << "连接失败";
qDebug() << db.lastError().text();
return;
}
else
{
qDebug() << "连接成功";
QMessageBox::information(this,"Tip","连接成功");
}
model = new QSqlTableModel(this);
model->setTable("devices"); // 设置要查询的表名
model->select(); // 执行查询操作
tableView = new QTableView(this);
tableView->setModel(model);
tableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);//启用编辑功能
tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); // 设置表头居中对齐
CenterAlignmentDelegate* delegate = new CenterAlignmentDelegate(this);//委托类
tableView->setItemDelegate(delegate);
tableView->verticalHeader()->setDefaultSectionSize(20);// 设置垂直表头的默认大小,自动显示行号
QVBoxLayout *layout = new QVBoxLayout(this); // 获取 Device1 的布局
layout->addWidget(tableView); // 将 QTableView 添加到布局中
}
5.QT使用UDL连接MySQL
5.1UDL文件
UDL(Universal Data Link)是一个Windows操作系统中的工具,用于创建和管理连接到各种数据源的数据链接文件。它提供了一个可视化的界面,使用户能够轻松地配置和测试与数据库的连接。UDL提供了一种简便的方式来创建和管理与数据库的连接。它不需要编写代码,只需通过图形界面进行配置,即可建立与不同类型的数据源的连接。UDL文件还可以方便地在应用程序中共享和重用,使得数据库连接的配置更加灵活和便捷。
5.2QT读取UDL
我首先在本项目中找到UDL文件,然后读取其中的连接字符串,通过键值对进行分析(借鉴其他博主),最后找到连接数据库需要的属性。
void Device1::UDL()
{
// 获取应用程序的当前目录
QString projectPath = QDir::currentPath();
QString udlFileExtension = "*.udl";//文件名过滤器,它会筛选出具有指定扩展名的文件
// 在整个工程目录及其子目录中递归搜索UDL文件
/*QDir::Files:表示只搜索文件,而不包括目录
QDir::Hidden:表示搜索隐藏的文件
QDir::NoSymLinks:表示跳过符号链接
QDirIterator::Subdirectories 是一个迭代器选项,迭代器在搜索过程中递归遍历子目录。*/
QDirIterator it(projectPath , QStringList() << udlFileExtension, QDir::Files | QDir::Hidden | QDir::NoSymLinks, QDirIterator::Subdirectories);
QStringList udlFilePath;
while (it.hasNext())
{
udlFilePath << it.next();
}
if (udlFilePath.isEmpty())
{
QMessageBox::warning(nullptr, "Warning", "No UDL files found!", QMessageBox::Ok);
}
else
{
QFile udlFile(udlFilePath.at(0));
QStringList udlList;
if (udlFile.open(QFile::ReadOnly | QFile::Truncate))
{
QTextStream inUdltream(&udlFile);
QString line = inUdltream.readLine();
while (!line.isNull())
{
udlList.append(line);
line = inUdltream.readLine();
}
}
// 关闭UDL文件
udlFile.close();
QMap<QString,QString> map;
if (udlList.size()==3)
{
QString str = udlList.at(2);
QStringList strlist = str.split(";");
for (int i = 0 ;i< strlist.size();i++)
{
QString pos= strlist.at(i);
QStringList posList =pos.split("=");
if (posList.size() == 2)//判断是不是键值对
{
map.insert(posList.at(0),posList.at(1));
}
}
}
name = map["UID"];
password = map["PASSWORD"];
server = map["SERVER"];
port = map["PORT"];
DATABASE = map["DB"];
}
}
void Device1::InitTable()
{
UDL();
db = QSqlDatabase::addDatabase("QODBC");
db.setHostName(server); //连接本地主机
db.setPort(port.toInt());
db.setUserName(name);
//设置数据库的密码
db.setPassword(password); //这个就是安装MySQL时设置的密码
db.setDatabaseName(DATABASE);
}
bool Device1::openDb()
{
if(!db.open())
{
qDebug() <<db.lastError().text();
QMessageBox::information(this, "Tip", "link failed");
}
else
{
qDebug() <<"连接成功";
QMessageBox::information(this, "Tip", "link success");
}
return true;
}
个人感觉QT中使用 UDL的话用上面的方式直接读取UDL文件内容,在分析匹配不是很方便,我想QT中如果直接指定UDL来连接MySQL,就可以很方便地在应用程序中共享和重用,只要在UDL文件修改数据连接属性应用程序就可以连接数据库,但一直没有实现,希望有大神可以指点一下。