前言
本文基于这一篇一文解决 | SQL Server2014数据库建立数据表和数据导入-CSDN博客建立的数据表所完成,实现更加方便快捷的方式读取数据库,不需要编写特定的代码进行连接SQL Server数据库接口,实现“一劳永逸”的读取数据过程。
注:该篇以C++ QT系统为基础,实现数据读取SQL Server数据库系统中的数据表,实现更加方便快捷的读取方式,不需要针对应用程序对不同类型数据库进行连接和操作时,必须编写不同的连接代码,增大工作量。
正文
01-建立ODBC数据源
Windows操作系统下包含ODBC数据源管理器(ODBC Data Source Administrator)工具,可以用于建立连接数据库的ODBC(Open Database Connectivity)数据源。ODBC数据源存储了与数据库连接相关的配置信息,如数据库服务器的地址、端口、数据库名称、登录用户名、密码等。通过建立将数据库信息存储在ODBC数据源中,可以实现系统与数据库进行连接。ODBC数据源管理器支持建立多种不同数据库的数据源,SQL Server、Oracle、MySQL都可以。
注:其实这里的原理就是系统直接访问数据库也是可以的,但是大型系统的管理不太方便,因此,使用一个“中间人”,通过这个“中间人”接口将系统和数据库联系起来,不需要系统直接对数据库进行操作。 系统 <-> ODBC数据源 <-> 数据库
1、打开创建ODBC数据源窗口
首先建立打开数据源,建立数据库对应的数据源,方便后续使用,windows下点击开始模块,进入搜索界面,输入ODBC,便可以查到所需内容,如下图所示。进入之后,选择添加按钮,可以进入下图,选择SQL Server,点击完成,便可以进入下一步操作。
2、数据源命名和服务器选择
点击添加之后,进入下方界面,需要输入数据源名称和选择服务器,数据源名称是对应所需的数据库的标识,后续系统也会使用。服务器也需要一一对应,输入完成之后,点击进入下一步。
3、输入密码建立连接
这里是上述建立数据源之后,进入下图界面,这里需要添加数据库的用户名和密码,需要与SQL Server登录时的用户名和密码保持一致。
4、选择需要连接的数据库
输入上述密码连接之后,就可以进入数据库系统中,下图是选择系统中需要的数据库的界面,点击下拉框选择即可。
5、测试数据源和结果
所有步骤完成之后,需要进行数据源测试,查看是否连接成功,只有这里连接成功,在C++ QT系统中才可以通过调用ODBC数据源与数据库连接。如下图所示。
02-建立配置文件和读取程序
1、建立文件
当建立ODBC数据源的步骤完成之后,数据库对应的用户名、密码等各种信息便存储在了数据源中,建立一个配置文件文本,用于存储这些信息,需要使用的时候,将这个配置文件放置在系统项目文件中即可。
如下图所示,这是一个.ini文件,存储了名为baori_mech_db数据库的所有信息。数据源名称为MSSQL_DSN_CA08。
2、读取配置文件
上面的配置文件建立完成之后,便可以在系统中进行读取,比如有一个.cpp文件需要读取数据库,以分文件编程为基础,建立了DB_Server.h文件,这里定义一些所需变量,主要就是需要包含这个类#include <QSqlDatabase>,这个类提供了可以使用QT访问ODBC数据源的各种函数,可以进行多项操作。
下面第一个代码文件DB_Server.h文件,第二个是DB_Server.cpp文件,用于函数实现,等过程,里面包含了读取配置文件db_server.ini过程,代码具体原理比较清晰,不再一一介绍。如果正常读取,便可以输出SQL SERVER服务器登录成功,可以进行数据资源访问操作。
注:使用时,直接将OpenDatabase()函数放在系统启动开始时即可,也可以使用其他操作,需要启动时再进行启动。
#pragma once
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
public:
bool OpenDatabase();
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "baori_db_WFC_CTRL");
QSqlQuery query;
#include "DB_Server.h"
#include "qdebug.h"
#include <qstring.h>
#include <QSqlError>
#include <QSqlDatabase>
#include <QSqlQuery>
bool DB_Server::OpenDatabase()
{
QString mssql_serverName, mssql_dbName, mssql_username, mssql_pwd, mssql_datasource;
QFile dbsvr_ini("db_server.ini");
if (!dbsvr_ini.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "配置文件db_server不能打开!" ;
return false;
}
QTextStream dbsvr_txtInput(&dbsvr_ini);
QString dbsvr_lineStr;
dbsvr_lineStr = dbsvr_txtInput.readLine();
mssql_serverName = dbsvr_lineStr.mid(17);
dbsvr_lineStr = dbsvr_txtInput.readLine();
mssql_dbName = dbsvr_lineStr.mid(13);
dbsvr_lineStr = dbsvr_txtInput.readLine();
mssql_username = dbsvr_lineStr.mid(15);
dbsvr_lineStr = dbsvr_txtInput.readLine();
mssql_pwd = dbsvr_lineStr.mid(10);
dbsvr_lineStr = dbsvr_txtInput.readLine();
mssql_datasource = dbsvr_lineStr.mid(17);
dbsvr_ini.close();
db.setDatabaseName(mssql_datasource);
db.setUserName(mssql_username);
db.setPassword(mssql_pwd);
QDateTime current_time;
QString str_current_time;
if (!db.open()) //打开数据库
{
qDebug() << "SQL SERVER服务器登录失败" ;
emit excel_file_not_exist_link(QString::fromLocal8Bit("SQL SERVER连接失败") + QString("[RT_DB_Open]!"));
emit msg_DB_con_link("SQL SERVER open failure in Zanj_WFC_ctrl");
}
else
{
qDebug() << "SQL SERVER服务器登录成功" ;
emit msg_DB_con_link("DB_con_ok");
sys_state = sys_state + "SQL SERVER open successful";
emit sys_state_update_link("0 SQL SERVER open successful");
}
return true;
}
03-系统读取数据
本篇中实现的是读取数据,并在对应的QT控件中显示,这里在.h文件中定义一个新的函数,然后在.cpp文件实现数据读取,仅展示了两个数据的读取示例,可以直接复制使用。
void DB_Server::data_result_view()
{
QSqlQuery query_prediction(db); // 这里对应上面读取的数据库
QDateTime finish_Qdatetime_new, finish_Qdatetime_old, current_time;
bool ok;
// 读取所需数据库,将引号中的数据表名称和主键改成自己对应的即可
bool exec = query_prediction.exec("SELECT * FROM "数据表名称" ORDER BY "主键" desc");
if (!exec)
{
qDebug() << query_prediction.lastError().text();//
}
query_prediction.last();
int nRow = query_prediction.at() + 1;
if (nRow < 1) return;
query_prediction.first();
// 读取数据,第一个值和第二个值,并复制对应变量
strt_hdgl_predict.AENTID = query_prediction.value(0).toString();
strt_hdgl_predict.ATIME = query_prediction.value(1).toString();
// 将参数填入对应控件中
ui->AENTID_QLE->setText(strt_hdgl_predict.AENTID);
ui->ATIME_QLE->setText(strt_hdgl_predict.ATIME);
QString temp5;
QTime time;
QString tr_timeDiff, str_current_time;
current_time = QDateTime::currentDateTime();
str_current_time = current_time.toString("yyyy-MM-dd hh:mm:ss");
ui->System_Time_QLE->setText(QString("%1").arg(str_current_time));
}
总结
上述完成了建立一个可以“一劳永逸”的数据源,这种方法对开发系统时所需的与数据库连接等功能实现提供了更加实用的思路。这也是对上一篇建立数据表之后,如何实现读取操作进行的后续说明,如果有问题,欢迎在评论区说明,后续还会更新其他内容,希望可以与各位大咖交流,互相学习。