C++ で sqlite の単一テーブルの追加、削除、変更、クエリを実装する詳細な手順

1.環境の準備

コーディングする前に、C++ 統合開発環境をインストールする必要があります。ここでは Visual Studio 2022 を選択しました。当初は CLion を使いたかったのですが、クラックするのが面倒で怠け者でした。それをするために。

  • Visual Studio 2022

2. プロジェクトの作成とコーディング

Visual Studio を起動し、[プロジェクトの作成] をクリックして、[空のプロジェクト] を選択します。
ここに画像の説明を挿入します
プロジェクト名、プロジェクトの作業ディレクトリ、ソリューション名を構成し、[作成] をクリックして C++ 空のプロジェクトを作成します。 。
ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します

CREATE TABLE IF NOT EXISTS t_student (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER,
    gender TEXT,
    class_no TEXT,
    grade_no TEXT,
    nation TEXT
);

コード

#include <sqlite3.h>
#include <iostream>
#include <vector>
#include <string>

const char* DB_FILE_PATH = "D:/commonTools/sqliteDB/student.db";

class DatabaseManager {
    
    
public:
    DatabaseManager() {
    
    
        int result = sqlite3_open(DB_FILE_PATH, &db_);
        if (result != SQLITE_OK) {
    
    
            std::cerr << "Failed to open database." << std::endl;
        }
    }

    ~DatabaseManager() {
    
    
        sqlite3_close(db_);
    }

    int executeSQL(const std::string& sql) {
    
    
        char* errMsg = nullptr;
        int result = sqlite3_exec(db_, sql.c_str(), nullptr, nullptr, &errMsg);
        if (result != SQLITE_OK) {
    
    
            std::cerr << "SQL error: " << errMsg << std::endl;
            sqlite3_free(errMsg);
        }
        return result;
    }

    sqlite3* getDB() {
    
    
        return db_;
    }

private:
    sqlite3* db_;
};

class Student {
    
    
public:
    Student(DatabaseManager& dbManager)
        : dbManager_(dbManager) {
    
    }


    void createTable() {
    
    
        const std::string sql = "CREATE TABLE IF NOT EXISTS t_student ("
            "id INTEGER PRIMARY KEY,"
            "name TEXT,"
            "age INTEGER,"
            "gender TEXT,"
            "class_no TEXT,"
            "grade_no TEXT,"
            "nation TEXT"
            ");";

        int result = dbManager_.executeSQL(sql);
        if (result != SQLITE_OK) {
    
    
            std::cerr << "Failed to create table." << std::endl;
        }
    }

    bool addStudent(const std::string& name, int age, const std::string& gender, const std::string& classNo, const std::string& gradeNo, const std::string& nation) {
    
    
        std::string sql = "INSERT INTO t_student (name, age, gender, class_no, grade_no, nation) VALUES ('" + name + "', " + std::to_string(age) + ", '" + gender + "', '" + classNo + "', '" + gradeNo + "', '" + nation + "');";
        int result = dbManager_.executeSQL(sql);
        return (result == SQLITE_OK);
    }

    bool deleteStudent(int id) {
    
    
        std::string sql = "DELETE FROM t_student WHERE id = " + std::to_string(id) + ";";
        int result = dbManager_.executeSQL(sql);
        return (result == SQLITE_OK);
    }

    bool updateStudent(int id, const std::string& name, int age, const std::string& gender, const std::string& classNo, const std::string& gradeNo, const std::string& nation) {
    
    
        std::string sql = "UPDATE t_student SET name = '" + name + "', age = " + std::to_string(age) + ", gender = '" + gender + "', class_no = '" + classNo + "', grade_no = '" + gradeNo + "', nation = '" + nation + "' WHERE id = " + std::to_string(id) + ";";
        int result = dbManager_.executeSQL(sql);
        return (result == SQLITE_OK);
    }

    std::vector<std::vector<std::string>> getAllStudents() {
    
    
        std::vector<std::vector<std::string>> students;
        std::string sql = "SELECT * FROM t_student;";
        sqlite3_stmt* statement;

        if (sqlite3_prepare_v2(dbManager_.getDB(), sql.c_str(), -1, &statement, nullptr) == SQLITE_OK) {
    
    
            while (sqlite3_step(statement) == SQLITE_ROW) {
    
    
                std::vector<std::string> studentData;
                int columnCount = sqlite3_column_count(statement);

                for (int i = 0; i < columnCount; ++i) {
    
    
                    const unsigned char* columnText = sqlite3_column_text(statement, i);
                    if (columnText) {
    
    
                        studentData.push_back(reinterpret_cast<const char*>(columnText));
                    }
                    else {
    
    
                        studentData.push_back("");
                    }
                }

                students.push_back(studentData);
            }

            sqlite3_finalize(statement);
        }
        else {
    
    
            std::cerr << "Failed to execute SQL statement: " << sql << std::endl;
        }

        return students;
    }

private:
    DatabaseManager& dbManager_;
};

int main() {
    
    
    // 创建数据库管理器对象
    DatabaseManager dbManager;

    // 创建学生对象
    Student student(dbManager);

    // 如果表不存在,先创建表
    student.createTable();

    // 添加学生
    student.addStudent("zhangsan", 20, "Female", "2301", "大一", "中国");

    // 更新学生信息
    student.updateStudent(1, "hanmeimei", 22, "Male", "2203", "大二", "中国");


    // 查询所有学生信息
    std::vector<std::vector<std::string>> allStudents = student.getAllStudents();
    for (const auto& studentData : allStudents) {
    
    
        for (const auto& value : studentData) {
    
    
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }

    // 删除学生
    // student.deleteStudent(1);

    std::cin.get();

    return 0;
}

ここに画像の説明を挿入します
上記のコードを記述した後、sqlite データの操作に関する大量のエラー メッセージが IDE に表示されますが、これは sqlite3 の関連ライブラリ ファイルがプロジェクトに導入されていないことが原因です。 sqlite3 ライブラリ ファイルを現在のプロジェクトに詳細に導入します。

3. sqlite3関連ライブラリをダウンロードする

ダウンロード アドレス:https://www.sqlite.org/download.html
ダウンロードするファイル:

ソースコード包:https://www.sqlite.org/2023/sqlite-amalgamation-3420000.zip

プリコンパイルされたバイナリ:https://www.sqlite.org/2023/sqlite-dll-win64-x64-3420000.zip
ここに画像の説明を挿入します

4. sqlite3.libライブラリファイルを生成する

これら 2 つのパッケージを抽出します
ここに画像の説明を挿入します解凍したファイルを一時的に名前を付けたディレクトリにコピーします。sqlitelib
ここに画像の説明を挿入します
Pass< a i=3>インストール ディレクトリ内の lib.exe は ディレクトリをコンパイルし、 ファイル を生成します。visual Studiosqlitelibsqlite.lib

通常、lib.exe が存在するディレクトリは[安装目录]\VisualStudio\2022\Community\VC\Tools\MSVC\14.36.32532\bin\Hostx64\です。ここでインストール ディレクトリをカスタマイズしました。デフォルトのインストールの場合、C ドライブの下にあるはずです。ディレクトリがどこにあるかわからない場合は、起動ショートカットを見つけてマウスを右クリックし、「ディレクトリ内のファイルを開く」でインストール ディレクトリを見つけます。
ここに画像の説明を挿入します
特別なヒント: 32 ビット システムの場合、sqlite.lib ファイルを生成するときは、[安装目录]\VisualStudio\2022\Community\VC\Tools\MSVC\14.36.32532\bin\Hostx86\x86< /span>lib.exe,

  • 64 ビット オペレーティング システムの場合:

lib.exe /out:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.lib /DEF:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.def

  • 32 ビット オペレーティング システムの場合:

lib.exe /out:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.lib /MACHINE:IX86 /DEF:D:\commonTools\CPPExtensions\sqlitelib\sqlite3.def

コンパイルが成功すると、次の図に示すように、2 つのファイルが sqlitelib ディレクトリに生成されます: sqlite3.libsqlite3.exp
ここに画像の説明を挿入します

sqlite3.dllC:\Windows\System32 ディレクトリにコピーします。このダイナミック ライブラリは実行時に必要になります。とにかく、実行してください。
ここに画像の説明を挿入します

5.sqlite3.libライブラリファイルをプロジェクトに導入します

[プロジェクト]-右クリック-[プロパティ]
ここに画像の説明を挿入します

5.1. 追加のインクルードディレクトリ設定

[C/C++]-[全般]-[追加のインクルード ディレクトリ]
ここに画像の説明を挿入します
lib.exe を使用して sqlite.lib ファイルをコンパイルおよび生成したディレクトリ sqlitelib を選択します ( sqlite.lib ファイルが存在するディレクトリを選択する必要があるだけであることに注意してください)
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.2.追加のライブラリディレクトリ設定

[リンカー]-[全般]-[追加ライブラリ ディレクトリ]
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
lib.exe を使用して sqlite.lib ファイルをコンパイルおよび生成したディレクトリ sqlitelib を選択します (注意)のみ sqlite.lib ファイルが存在するディレクトリを選択するだけです)
ここに画像の説明を挿入します
[OK] をクリックします
ここに画像の説明を挿入します

5.3.追加の依存関係設定

[リンカ]-[入力]-[追加の依存関係]
ここに画像の説明を挿入します
ここに画像の説明を挿入します

lib.exe でコンパイルおよび生成するために使用した sqlite3.lib ファイルを選択します (sqlite3.lib ファイルの絶対パスをここで構成する必要があることに注意してください)
ここに画像の説明を挿入します
ここに画像の説明を挿入します

最後に [適用] と [OK] をクリックして設定の変更を保存します。
ここに画像の説明を挿入します
プロジェクトを再度開き、SQLite に関連する構文エラーがないことを確認します。デバッグ テストを実行します
ここに画像の説明を挿入します
。デバッグは成功し、データベース操作も成功します。
ここに画像の説明を挿入します

データベースをリンクしてデータを見ると、正常にデータが書き込まれていることがわかります。中国語の文字化けはエンコードの問題です。ここでエンコードを設定するだけで非常に簡単です。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_41865652/article/details/130952015