13,230
回編集
(ページの作成:「== 概要 == <br><br> == SQLite3 == Qtを使用してSQLite3のテーブルにアクセスする場合、まず、<code>QSqlDatabase</code>クラスを使用してデータベースに接続する。<br> <syntaxhighlight lang="c++"> #include <QSqlDatabase> #include <QSqlQuery> // SQLiteデータベースに接続する QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("<SQLiteデータベース名>.sqlite"); // データベース…」) |
|||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
<br><br> | |||
== MariaDB == | |||
以下の例では、MariaDBのデータベースを使用して、以下に示すようなテーブルを作成して基本的なCRUD操作を行っている。<br> | |||
実務では、必要に応じてフィールドを追加、または、データ型や制約を調整したりする必要がある。<br> | |||
* テーブル名 | |||
*: people | |||
* id | |||
*: INT型 | |||
*: 制約 1 : AUTO_INCREMENT | |||
*: 制約 2 : PRIMARY KEY | |||
*: 各レコードを一意に識別するための自動増分の主キー。 | |||
* name | |||
*: VARCHAR(40)型 | |||
*: 制約 : NOT NULL | |||
*: 名前を格納するフィールドで、最大40文字まで保存可能。 | |||
* age | |||
*: INT型 | |||
*: 年齢を格納する整数型のフィールド。 | |||
<br> | |||
<u>また、使用時にはエラーハンドリングおよびセキュリティ対策 (SQLインジェクション対策等) を適切に実装することを推奨する。</u><br> | |||
<br> | |||
<syntaxhighlight lang="cmake"> | |||
# CMakeLists.txtファイル | |||
cmake_minimum_required(VERSION 3.21) | |||
project(QtMariaDBProject LANGUAGES CXX) | |||
set(CMAKE_INCLUDE_CURRENT_DIR ON) | |||
set(CMAKE_AUTOUIC ON) | |||
set(CMAKE_AUTOMOC ON) | |||
set(CMAKE_AUTORCC ON) | |||
set(CMAKE_CXX_STANDARD 17) | |||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | |||
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Sql) | |||
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Sql) | |||
# MariaDB Connector/Cを検索 | |||
find_path(MARIADB_INCLUDE_DIR mysql.h | |||
/usr/include/mysql | |||
) | |||
find_library(MARIADB_LIBRARY NAMES mariadb | |||
PATHS | |||
/usr/lib | |||
/usr/lib64 | |||
) | |||
if(NOT MARIADB_INCLUDE_DIR OR NOT MARIADB_LIBRARY) | |||
message(FATAL_ERROR "MariaDB Connector/C not found!") | |||
endif() | |||
add_executable(QtMariaDBProject | |||
main.cpp | |||
DataBaseManager.h | |||
DataBaseManager.cpp | |||
) | |||
# QtライブラリとMariaDBライブラリをリンク | |||
target_link_libraries(QtMariaDBProject PRIVATE | |||
Qt${QT_VERSION_MAJOR}::Core | |||
Qt${QT_VERSION_MAJOR}::Sql | |||
${MARIADB_LIBRARY} | |||
) | |||
# MariaDBのヘッダファイルのディレクトリを追加 | |||
target_include_directories(QtMariaDBProject PRIVATE | |||
${MARIADB_INCLUDE_DIR} | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// DataBaseManager.hファイル | |||
#include <QtSql> | |||
#include <QDebug> | |||
class DatabaseManager | |||
{ | |||
public: | |||
DatabaseManager(); | |||
~DatabaseManager(); | |||
bool openConnection(); | |||
void closeConnection(); | |||
bool createTable(); | |||
bool insertRecord(const QString &name, int age); | |||
bool updateRecord(int id, const QString &name, int age); | |||
bool deleteRecord(int id); | |||
void readAllRecords(); | |||
private: | |||
QSqlDatabase db; | |||
}; | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// DataBaseManager.cppファイル | |||
#include "DataBaseManager.h" | |||
DatabaseManager::DatabaseManager() | |||
{ | |||
db = QSqlDatabase::addDatabase("QMYSQL"); | |||
db.setHostName("<ホスト名またはIPアドレス 例: localhost>"); | |||
db.setDatabaseName("<データベース名 例: sampledb>"); | |||
db.setUserName("<データベースのユーザ名>"); | |||
db.setPassword("<データベースのユーザ名のパスワード>"); | |||
} | |||
DatabaseManager::~DatabaseManager() | |||
{ | |||
closeConnection(); | |||
} | |||
// データベースの接続 | |||
bool DatabaseManager::openConnection() | |||
{ | |||
if (!db.open()) { | |||
qDebug() << "Error: connection with database failed"; | |||
return false; | |||
} | |||
else { | |||
qDebug() << "Database: connection ok"; | |||
return true; | |||
} | |||
} | |||
// データベースの切断 | |||
void DatabaseManager::closeConnection() | |||
{ | |||
db.close(); | |||
} | |||
// テーブルの作成 | |||
bool DatabaseManager::createTable() | |||
{ | |||
QSqlQuery query; | |||
query.prepare("CREATE TABLE IF NOT EXISTS people (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(40) NOT NULL, age INT)"); | |||
if (!query.exec()) { | |||
qDebug() << "Error creating table:" << query.lastError().text(); | |||
return false; | |||
} | |||
return true; | |||
} | |||
// 単一のレコードの追加 | |||
bool DatabaseManager::insertRecord(const QString& name, int age) | |||
{ | |||
QSqlQuery query; | |||
query.prepare("INSERT INTO people (name, age) VALUES (:name, :age)"); | |||
query.bindValue(":name", name); | |||
query.bindValue(":age", age); | |||
if (!query.exec()) { | |||
qDebug() << "Error inserting record:" << query.lastError().text(); | |||
return false; | |||
} | |||
return true; | |||
} | |||
// 単一のレコードの更新 | |||
bool DatabaseManager::updateRecord(int id, const QString& name, int age) | |||
{ | |||
QSqlQuery query; | |||
query.prepare("UPDATE people SET name = :name, age = :age WHERE id = :id"); | |||
query.bindValue(":id", id); | |||
query.bindValue(":name", name); | |||
query.bindValue(":age", age); | |||
if (!query.exec()) { | |||
qDebug() << "Error updating record:" << query.lastError().text(); | |||
return false; | |||
} | |||
return true; | |||
} | |||
bool DatabaseManager::deleteRecord(int id) | |||
{ | |||
QSqlQuery query; | |||
query.prepare("DELETE FROM people WHERE id = :id"); | |||
query.bindValue(":id", id); | |||
if (!query.exec()) { | |||
qDebug() << "Error deleting record:" << query.lastError().text(); | |||
return false; | |||
} | |||
return true; | |||
} | |||
// 全てのレコードを読み込む | |||
void DatabaseManager::readAllRecords() | |||
{ | |||
QSqlQuery query("SELECT * FROM people"); | |||
while (query.next()) { | |||
int id = query.value(0).toInt(); | |||
QString name = query.value(1).toString(); | |||
int age = query.value(2).toInt(); | |||
qDebug() << "ID:" << id << "Name:" << name << "Age:" << age; | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// main.cppファイル | |||
int main() | |||
{ | |||
DatabaseManager dbManager; | |||
if (dbManager.openConnection()) { | |||
// テーブルの作成 | |||
dbManager.createTable(); | |||
// レコードの追加 | |||
dbManager.insertRecord("John Doe", 30); | |||
dbManager.insertRecord("Jane Smith", 25); | |||
// 全てのレコードを読み込む | |||
dbManager.readAllRecords(); | |||
// 既存のレコードの更新 | |||
dbManager.updateRecord(1, "John Doe Updated", 31); | |||
// 任意のレコードの削除 | |||
dbManager.deleteRecord(2); | |||
// 全てのレコードを読み込む | |||
dbManager.readAllRecords(); | |||
// データーベースを切断 | |||
dbManager.closeConnection(); | |||
} | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||