柚子快報(bào)邀請(qǐng)碼778899分享:c++ 數(shù)據(jù)庫(kù)-ODBC操作
承接Qt/C++軟件開(kāi)發(fā)項(xiàng)目,高質(zhì)量交付,靈活溝通,長(zhǎng)期維護(hù)支持。需求所尋,技術(shù)正適,共創(chuàng)完美,歡迎私信聯(lián)系!
一、ODBC 數(shù)據(jù)源配置
打開(kāi)ODBC數(shù)據(jù)源管理器:
在Windows搜索欄中鍵入“ODBC數(shù)據(jù)源”并選擇“ODBC數(shù)據(jù)源(64位)”(如果你的系統(tǒng)是64位的)。如果你的系統(tǒng)是32位的,你可以選擇“ODBC數(shù)據(jù)源(32位)”?;蛘?,你可以在控制面板中找到ODBC數(shù)據(jù)源管理器。
添加數(shù)據(jù)源:
在ODBC數(shù)據(jù)源管理器中,選擇“用戶(hù)DSN/系統(tǒng)DSN”選項(xiàng)卡。點(diǎn)擊“添加”按鈕,在彈出的對(duì)話框中選擇要配置的數(shù)據(jù)庫(kù)類(lèi)型(如SQLite、MySQL等)。根據(jù)數(shù)據(jù)庫(kù)類(lèi)型和具體的配置要求填寫(xiě)相應(yīng)的信息,例如數(shù)據(jù)庫(kù)文件路徑、服務(wù)器名稱(chēng)、用戶(hù)名、密碼等。完成配置后,點(diǎn)擊“確定”按鈕。
二、使用ODBC的優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
????????平臺(tái)獨(dú)立性:ODBC提供了一種標(biāo)準(zhǔn)的API,使得應(yīng)用程序可以在不同的操作系統(tǒng)上連接和操作數(shù)據(jù)庫(kù),從而實(shí)現(xiàn)了一定程度的平臺(tái)獨(dú)立性。
????????數(shù)據(jù)庫(kù)透明性:通過(guò)ODBC,應(yīng)用程序可以通過(guò)相同的API連接到不同類(lèi)型的數(shù)據(jù)庫(kù),無(wú)論是關(guān)系型數(shù)據(jù)庫(kù)還是非關(guān)系型數(shù)據(jù)庫(kù),這增加了靈活性和可擴(kuò)展性。
????????易于維護(hù):ODBC提供了一種標(biāo)準(zhǔn)的接口,使得數(shù)據(jù)庫(kù)連接和操作可以在不修改應(yīng)用程序代碼的情況下進(jìn)行配置和更改。這使得維護(hù)和管理數(shù)據(jù)庫(kù)連接變得更加簡(jiǎn)單。
????????大量的驅(qū)動(dòng)支持:由于ODBC已經(jīng)成為了一種行業(yè)標(biāo)準(zhǔn),幾乎所有的主流數(shù)據(jù)庫(kù)供應(yīng)商都提供了ODBC驅(qū)動(dòng)程序,因此你可以很容易地連接到各種不同類(lèi)型的數(shù)據(jù)庫(kù)。
缺點(diǎn):
????????性能損失:與直接使用特定數(shù)據(jù)庫(kù)的本地API相比,通過(guò)ODBC連接數(shù)據(jù)庫(kù)可能會(huì)帶來(lái)一定的性能損失,因?yàn)樗婕暗筋~外的數(shù)據(jù)轉(zhuǎn)換和通信開(kāi)銷(xiāo)。
????????功能限制:由于ODBC只提供了一種標(biāo)準(zhǔn)的API,因此某些特定于數(shù)據(jù)庫(kù)引擎的功能可能無(wú)法直接通過(guò)ODBC訪問(wèn),你可能需要使用特定數(shù)據(jù)庫(kù)的本地API來(lái)實(shí)現(xiàn)這些功能。
????????連接和配置復(fù)雜性:配置和管理ODBC數(shù)據(jù)源可能需要一些額外的工作,特別是對(duì)于一些復(fù)雜的數(shù)據(jù)庫(kù)配置,可能需要更多的時(shí)間和精力。
????????平臺(tái)依賴(lài)性:雖然ODBC提供了一定程度的平臺(tái)獨(dú)立性,但在不同的操作系統(tǒng)上可能會(huì)有一些細(xì)微的差異,這可能需要在跨平臺(tái)應(yīng)用程序中進(jìn)行一些額外的處理。
三、實(shí)現(xiàn)操作代碼
創(chuàng)建了一個(gè)名為DatabaseManager的類(lèi),其中分為通過(guò)ODBC數(shù)據(jù)源模式和直接ODBC訪問(wèn)數(shù)據(jù)庫(kù)模式,注意代碼注釋內(nèi)容。
#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H
#include
#include
#include
typedef struct{
QString username;
QString password;
QString databaseName;
QString serverName;
QString driverName;
}T_Database;
/*
* 數(shù)據(jù)庫(kù)操作管理類(lèi)
*/
class DatabaseManager : public QObject
{
Q_OBJECT
public:
DatabaseManager(QObject *parent = nullptr);
~DatabaseManager();
// 打開(kāi)數(shù)據(jù)庫(kù)
bool openDB(const T_Database &data);
// 關(guān)閉數(shù)據(jù)庫(kù)
void closeDB();
// 數(shù)據(jù)庫(kù)是否有效
bool isDatabaseValid();
// 判斷字段值是否存在
bool isExistsValue(const QString& tableName, const QString& condition);
// 創(chuàng)建表
bool createTable(const QString& createSql);
// 插入數(shù)據(jù)
bool insertData(const QString& tableName, const QMap
// 刪除數(shù)據(jù)
bool deleteData(const QString& tableName, const QString& condition);
// 更新數(shù)據(jù)
bool updateData(const QString& tableName, const QString& condition, const QMap
// 查詢(xún)數(shù)據(jù)
bool queryData(const QString& tableName, const QString& condition, QList
private:
QSqlDatabase m_db;
};
#endif // DATABASEMANAGER_H
#include "databasemanager.h"
#include
#include
#include
#include
#pragma execution_character_set("utf-8")
DatabaseManager::DatabaseManager(QObject* parent)
: QObject(parent)
{
}
DatabaseManager::~DatabaseManager()
{
}
bool DatabaseManager::openDB(const T_Database &data)
{
if (isDatabaseValid())
{
return true;
}
m_db = QSqlDatabase::addDatabase("QODBC");
if (!m_db.isValid())
{
QStringList drivers = QSqlDatabase::drivers();
qDebug() << "drivers: " << drivers;
qCritical() << "Failed to load QODBC driver. " << m_db.lastError().text();
return false;
}
// 方法一、連接到ODBC數(shù)據(jù)源
// m_db.setDatabaseName(dataSourceName);
// 方法二、直接通過(guò)ODBC連接數(shù)據(jù)庫(kù)
QString connectionString = QString("DRIVER={%1};SERVER=%2;DATABASE=%3;UID=%4;PWD=%5;PORT=%6;")
.arg(data.driverName)
.arg(data.serverName)
.arg(data.databaseName)
.arg(data.username)
.arg(data.password)
.arg(data.serverPort);
m_db.setDatabaseName(connectionString);
if (!m_db.open())
{
qCritical() << "Error: Failed to connect to database." << m_db.lastError().text();
return false;
}
return true;
}
void DatabaseManager::closeDB()
{
if (m_db.isOpen())
{
m_db.close();
}
}
bool DatabaseManager::isDatabaseValid()
{
return (m_db.isOpen() || m_db.isValid());
}
bool DatabaseManager::isExistsValue(const QString& tableName, const QString& condition)
{
QString sql = QString("SELECT * FROM %2").arg(tableName);
if(!condition.isEmpty())
{
sql += " " + condition;
}
QSqlQuery selectQuery;
selectQuery.prepare(sql);
// 綁定參數(shù)或拼接查詢(xún)條件
// selectQuery.bindValue(...);
if (!selectQuery.exec())
{
qCritical() << "Error: Failed to select data from the database. " << selectQuery.lastError().text();
return false;
}
if (selectQuery.next())
{
// 字段的值存在
// 執(zhí)行相應(yīng)的邏輯
// ...
return true;
}
// 字段的值不存在
// 執(zhí)行相應(yīng)的邏輯
// ...
//
return false;
}
bool DatabaseManager::createTable(const QString& createSql)
{
if (!isDatabaseValid())
{
qCritical() << "Error: Database connection is not valid.";
return false;
}
qDebug() << "createTable: " << createSql;
QSqlQuery query;
if (!query.exec(createSql))
{
qCritical() << "Error: Failed to create table.";
return false;
}
query.finish();
return true;
}
bool DatabaseManager::insertData(const QString& tableName, const QMap
{
if (!isDatabaseValid())
{
qCritical() << "Error: Database is not valid.";
return false;
}
QString sql = "INSERT INTO " + tableName + " (";
QString values = "VALUES (";
// 構(gòu)建字段列表和值列表
QStringList fields;
QStringList placeholders;
for (const auto& key : data.keys())
{
fields << key;
placeholders << ":" + key;
}
sql += fields.join(", ") + ") ";
values += placeholders.join(", ") + ")";
QSqlQuery query;
query.prepare(sql + values);
// 綁定參數(shù)
for (const auto& key : data.keys())
{
query.bindValue(":" + key, data.value(key));
}
qDebug() << "insertData: " << sql + values;
if (!query.exec())
{
qCritical() << "Error: Failed to insert data into database. " << query.lastError().text();
return false;
}
query.finish();
return true;
}
bool DatabaseManager::deleteData(const QString& tableName, const QString& condition)
{
if (!isDatabaseValid())
{
qCritical() << "Error: Database is not valid.";
return false;
}
QString sql = "DELETE FROM " + tableName + " " + condition;
qDebug() << "deleteData: " << sql;
QSqlQuery query;
query.prepare(sql);
if (!query.exec())
{
qCritical() << "Error: Failed to delete data from database. " << query.lastError().text();
return false;
}
return true;
}
bool DatabaseManager::updateData(const QString& tableName, const QString& condition,
const QMap
{
if (!isDatabaseValid())
{
qCritical() << "Error: Database is not valid.";
return false;
}
QString sql = "UPDATE " + tableName + " SET ";
// 構(gòu)建更新字段列表
QStringList updates;
for (const auto& key : data.keys())
{
updates << key + " = :" + key;
}
sql += updates.join(", ") + " " + condition;
qDebug() << "updateData: " << sql;
QSqlQuery query;
query.prepare(sql);
// 綁定參數(shù)
for (const auto& key : data.keys())
{
query.bindValue(":" + key, data.value(key));
}
if (!query.exec())
{
qCritical() << "Error: Failed to update data in database. " << query.lastError().text();
return false;
}
query.finish();
return true;
}
bool DatabaseManager::queryData(const QString& tableName, const QString& condition,
QList
{
if (!isDatabaseValid())
{
qCritical() << "Error: Database is not valid.";
return false;
}
QString sql = "SELECT * FROM " + tableName;
if (!condition.isEmpty())
{
sql += " " + condition;
}
qDebug() << "queryData: " << sql;
QSqlQuery query(sql);
while (query.next())
{
QMap
QSqlRecord record = query.record();
for (int i = 0; i < record.count(); i++)
{
QString fieldName = record.fieldName(i);
QVariant value = query.value(i);
row.insert(fieldName, value);
}
data.append(row);
}
query.finish();
return true;
}
柚子快報(bào)邀請(qǐng)碼778899分享:c++ 數(shù)據(jù)庫(kù)-ODBC操作
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。