欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:c++ 數(shù)據(jù)庫(kù)-ODBC操作

柚子快報(bào)邀請(qǐng)碼778899分享:c++ 數(shù)據(jù)庫(kù)-ODBC操作

http://yzkb.51969.com/

承接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& data);

// 刪除數(shù)據(jù)

bool deleteData(const QString& tableName, const QString& condition);

// 更新數(shù)據(jù)

bool updateData(const QString& tableName, const QString& condition, const QMap& data);

// 查詢(xún)數(shù)據(jù)

bool queryData(const QString& tableName, const QString& condition, QList>& data);

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& data)

{

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& data)

{

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>& data)

{

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 row;

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操作

http://yzkb.51969.com/

好文推薦

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19186553.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄