QT学习笔记-QT访问各种关系数据库笔记汇总
QT学习笔记-QT访问各种关系数据库笔记汇总
在使用QT进行应用开发过程中,不可避免的会涉及到访问关系数据库,为了方便后期查阅笔记,在本文进行一下汇总。
1、QT访问Oracle数据库
1.1、关于QT访问Oracle数据库的驱动编译请参阅
1.1.1 《QT学习笔记-QT安装oracle oci驱动》
1.1.2 《QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板》
1.2、关键步骤:
1.2.1 配置oracleclient的环境变量LD_LIBRARY_PATH,或者直接在代码中通过QLibrary加载依赖库
1.2.2 参考代码
void Widget::on_btnDbTest_clicked()
{
#ifdef Q_OS_WIN
QLibrary *oci_lib = new QLibrary("D:/oracleinstantclient_19_19/oci.dll");
oci_lib->load();
if (!oci_lib->isLoaded())
{
qDebug() << "oracle oci动态库加载失败!";
return;
}
#else
QLibrary *oci_lib = new QLibrary("/usr/lib/oracleclient/instantclient_19_19/libclntsh.so");
bool loadresult = oci_lib->load();
qDebug() << "oracle oci动态库load result is " << loadresult;
if (!loadresult)
{
qDebug() << oci_lib->errorString();
}
if (!oci_lib->isLoaded())
{
qDebug() << "oracle oci动态库libclntsh.so加载失败!";
return;
}
#endif
//以下代码测试访问Oracle数据
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
db.setHostName("xxx.xxx.xxx.xxx"); //数据库服务器的ip
db.setPort(1521); //数据库服务器的端口号
db.setDatabaseName("orcl"); //此处写你数据库的实例名称
db.setUserName("oracle"); //写数据库的用户名
db.setPassword("oracle@123"); //写数据库的密码
if (!db.open())
{
qDebug() << "数据库连接失败!";
QSqlError lastError = db.lastError();
qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
}
else
{
qDebug() << "数据库连接成功!";
QSqlQuery query(db);
if (query.exec("select * from sys_user"))
{
qDebug() << "查询表格sys_user成功!";
while(query.next())
{
qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
}
}
}
}
2、QT访问SQLServer数据库
2.1、关于QT访问SQL Server数据库的驱动编译请参阅
2.1.1 《QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库》
2.2 参考代码
void Widget::on_btnDbTest_clicked()
{
//以下代码测试访问SQLServer数据
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("mydsn"); //此处写你配置的ODBC数据源的名称
db.setUserName("sa"); //写数据库的用户名
db.setPassword("sa@123"); //写数据库的密码
if (!db.open())
{
qDebug() << "数据库连接失败!";
QSqlError lastError = db.lastError();
qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
}
else
{
qDebug() << "数据库连接成功!";
QSqlQuery query(db);
if (query.exec("select * from sys_user"))
{
qDebug() << "查询表格sys_user成功!";
while(query.next())
{
qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
}
}
}
}
3、QT访问MySQL数据库
3.1 关于QT访问MySQL数据库的驱动编译请参阅
3.1.1 《QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动》
3.2 参考代码
void Widget::on_btnDbTest_clicked()
{
//以下代码测试访问MySQL数据
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("xxx.xxx.xxx.xxx"); //数据库服务器的ip
db.setPort(3306); //数据库服务器的端口号
db.setDatabaseName("mydbname"); //此处写你数据库的名称
db.setUserName("root"); //写mysql数据库的用户名
db.setPassword("root@123"); //写mysql数据库的密码
if (!db.open())
{
qDebug() << "数据库连接失败!";
QSqlError lastError = db.lastError();
qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
}
else
{
qDebug() << "数据库连接成功!";
QSqlQuery query(db);
if (query.exec("select * from sys_user"))
{
qDebug() << "查询表格sys_user成功!";
while(query.next())
{
qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
}
}
}
}
4、QT访问PostgreSQL数据库
4.1 关于QT访问PostgreSQL数据库的驱动编译请参阅
4.1.1《QT学习笔记-QT安装postgresql驱动》
4.1.2 《QT学习笔记-postgresq数据库l驱动移植到RK3568ARM开发板》
4.2 参考代码
void Widget::on_btnDbTest_clicked()
{
//以下代码测试访问PostgreSQL数据
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("xxx.xxx.xxx.xxx"); //数据库服务器的ip
db.setPort(5432); //数据库服务器的端口号
db.setDatabaseName("mydbname"); //此处写你数据库的名称
db.setUserName("postgres"); //写数据库的用户名
db.setPassword("postgres"); //写数据库的密码
if (!db.open())
{
qDebug() << "数据库连接失败!";
QSqlError lastError = db.lastError();
qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
}
else
{
qDebug() << "数据库连接成功!";
QSqlQuery query(db);
if (query.exec("select * from sys_user"))
{
qDebug() << "查询表格sys_user成功!";
while(query.next())
{
qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
}
}
}
}
5、QT访问Access数据库
5.1 参考代码
void Widget::on_btnDbTest_clicked()
{
//以下代码测试访问Access数据
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb"); //此处写你配置的ODBC数据源的名称或这连接字符串
db.setPassword("sa@123"); //写数据库的密码
if (!db.open())
{
qDebug() << "数据库连接失败!";
QSqlError lastError = db.lastError();
qCritical() << lastError.nativeErrorCode() << ", " << lastError.text();
}
else
{
qDebug() << "数据库连接成功!";
QSqlQuery query(db);
if (query.exec("select * from sys_user"))
{
qDebug() << "查询表格sys_user成功!";
while(query.next())
{
qDebug() << query.value(0).toInt() << ", " << query.value(1).toString() << ", " << query.value(2).toString() << "," << query.value(3).toString();
}
}
}
}
6、QT多线程中访问数据库的要点
在不同线程中访问数据库时,关键时在创建QSqlDatabase对象时采用不用的连接名称,如下:
QSqlDatabase db1 = QSqlDatabase::addDatabase("QODBC", "MainThread");
QSqlDatabase db2 = QSqlDatabase::addDatabase("QODBC", "SubThread");
//db1和db2在采用不用的连接名称MainThread、SubThread