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 Studio
sqlitelib
sqlite.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.lib
と sqlite3.exp
。
sqlite3.dll
をC:\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 に関連する構文エラーがないことを確認します。デバッグ テストを実行します
。デバッグは成功し、データベース操作も成功します。
データベースをリンクしてデータを見ると、正常にデータが書き込まれていることがわかります。中国語の文字化けはエンコードの問題です。ここでエンコードを設定するだけで非常に簡単です。