C 言語の例 - SQLITE データベースを呼び出してデータの追加、削除、変更、クエリを実行する

1. SQLite の概要

SQLite は、軽量のリレーショナル データベース管理システム (RDBMS) であり、オープン ソース、構成不要、サーバー側、自己完結型、管理不要のトランザクション SQL データベース エンジンです。組み込みデバイス、モバイルデバイス、デスクトップアプリケーションで広く使用されています。

SQLite の機能は次のとおりです。

(1) 軽量: SQLite のコア ライブラリはわずか数百 KB であり、組み込みデバイスやモバイル デバイスなどのリソースに制約のある環境での使用に非常に適しています。

(2) ゼロ構成: SQLite は構成を必要とせず、ライブラリ ファイルをアプリケーションに埋め込むだけで済みます。

(3) サーバー側: SQLite をサーバー上で実行する必要はなく、すべてのデータはローカル ファイルに保存されます。

(4) 自己完結型: SQLite のすべての機能は、他のライブラリ ファイルに依存せず、別個のライブラリ ファイルに含まれています。

(5) ゼロ管理: SQLite はデータベース接続やトランザクションなどのステータスを維持する必要がなく、すべての操作が自動です。

(6) トランザクション: SQLite は、データの一貫性と信頼性を確保するために ACID トランザクションをサポートしています。

SQLite は、SELECT、INSERT、UPDATE、DELETE などの操作を含む標準 SQL ステートメントをサポートし、整数、浮動小数点数、文字列、日付などの複数のデータ型もサポートします。SQLite は、C、C++、Python、Java などの複数のプログラミング言語もサポートしており、さまざまなアプリケーションに簡単に統合できます。

画像-20230626212753200

Windows システムでは、次の手順に従って SQLite データベースをダウンロードしてインストールできます。

(1) SQLite の公式 Web サイトを開きます: https://www.sqlite.org/index.html

(2) ウェブサイト上部のメニューバーで「ダウンロード」をクリックし、ダウンロードページに入ります。

(3) ダウンロード ページには、利用可能なプリコンパイル済みバイナリがいくつか表示されます。Windows オペレーティング システムのビット数 (32 ビットまたは 64 ビット) とニーズに応じて、適切なバージョンを選択してください。

(4) 32 ビット システムの場合は、「Windows 用プリコンパイル済みバイナリ」セクションのファイルを直接sqlite-dll-win32-x86-*.zipダウンロードできます。sqlite-tools-win32-x86-*.zip

(5) 64 ビット システムの場合は、「Windows 用プリコンパイル済みバイナリ」セクションのファイルを直接sqlite-dll-win64-x64-*.zipダウンロードできます。sqlite-tools-win64-x64-*.zip

(6) ダウンロードが完了したら、sqlite-dll-win*.zipファイルを解凍してsqlite3.dllファイルを入手します。

(7) フォルダーを作成し (SQLite またはその他の好きな名前を付けます)、sqlite3.dllファイルをこのフォルダーにコピーします。

(8) 次に、sqlite-tools-win*.zipファイルを解凍して、 sqlite3.exe、ファイルsqlite3_analyzer.exeを含むツール ファイルのセットを取得しますsqlite3.def

(8) これらのツールファイルを、先ほど作成した SQLite フォルダーにコピーします。

2、SQLite 構文

SQLite は、標準の SQL 構文をサポートする軽量の組み込みデータベースです。

SQLite データベースのテーブルの作成、データの挿入、データの削除、データの更新、およびデータのクエリの構文を以下に 1 つずつ紹介します。

(1) テーブルを作成する

SQLite データベースにテーブルを作成するには、CREATE TABLE次のステートメントを使用できます。構文は次のとおりです。

CREATE TABLE table_name (
    column1 datatype constraint,
    column2 datatype constraint,
    ...
);
  • table_name作成するテーブルの名前です。
  • column1column2などはテーブルの列名です。
  • datatype列のデータ型です。
  • constraintオプションであり、主キー、一意制約、外部キーなどの列制約を定義するために使用されます。

たとえば、id、名前、年齢の 3 つの列を持つ「students」というテーブルを作成します。

CREATE TABLE students (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER
);

(2) データの挿入

SQLite データベースのテーブルにデータを挿入するには、INSERT INTOステートメントを使用できます。構文は次のとおりです。

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
  • table_nameデータを挿入するテーブルの名前です。
  • column1column2などはテーブルの列名です。
  • value1value2などは、挿入される具体的な値です。

たとえば、「students」テーブルにデータを挿入するには、次のようにします。

INSERT INTO students (id, name, age)
VALUES (1, '张三', 20);

(3) データの削除

SQLite データベースのテーブルからデータを削除するには、DELETE FROMステートメントを使用できます。構文は次のとおりです。

DELETE FROM table_name
WHERE condition;
  • table_nameデータを削除するテーブルの名前です。
  • conditionはオプションで、データを削除する条件を指定するために使用されます。

たとえば、ID 1 のデータを「students」テーブルから削除するには、次のようにします。

DELETE FROM students
WHERE id = 1;

(4) データ更新

SQLite データベース テーブル内のデータを更新するには、UPDATEステートメントを使用できます。構文は次のとおりです。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • table_nameデータを更新するテーブルの名前です。
  • column1column2などは更新する列名です。
  • value1value2などは更新される具体的な値です。
  • conditionはオプションで、データを更新する条件を指定するために使用されます。

たとえば、「students」テーブルの ID 1 のデータの名前を「Li Si」に更新し、年齢を 22 に更新します。

UPDATE students
SET name = '李四', age = 22
WHERE id = 1;

(5) クエリデータ

SQLite データベース テーブルのデータをクエリするには、SELECTステートメントを使用できます。構文は次のとおりです。

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • column1、などはクエリ対象の列名です。すべての列をクエリしたい場合は、代わりに記号をcolumn2使用できます。*
  • table_nameデータをクエリするテーブルの名前です。
  • conditionこれはオプションであり、データをクエリするための条件を指定するために使用されます。

たとえば、「students」テーブルのすべてのデータをクエリするには、次のようにします。

SELECT * FROM students;

3. 完全なコード

次の C 言語コードは、SQLite データベースの使用方法を示しています。

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

// 数据库文件名
const char* DB_FILE = "example.db";

// 回调函数,用于执行查询sql语句后的结果处理
int selectCallback(void* data, int argc, char** argv, char** azColName)
{
    
    
    int i;
    for (i = 0; i < argc; i++)
    {
    
    
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    
    return 0;
}

// 初始化数据库连接
sqlite3* initDatabase()
{
    
    
    sqlite3* db;
    
    int rc = sqlite3_open(DB_FILE, &db);
    if (rc != SQLITE_OK)
    {
    
    
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return NULL;
    }
    
    return db;
}

// 关闭数据库连接
void closeDatabase(sqlite3* db)
{
    
    
    if (db)
    {
    
    
        sqlite3_close(db);
    }
}

// 创建表
void createTable(sqlite3* db)
{
    
    
    char* errMsg;
    const char* createSql = "CREATE TABLE IF NOT EXISTS students (id INT PRIMARY KEY, name TEXT, age INT);";
    
    int rc = sqlite3_exec(db, createSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
    
    
        fprintf(stderr, "无法创建表: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
    
    
        printf("表创建成功\n");
    }
}

// 插入数据
void insertData(sqlite3* db, int id, const char* name, int age)
{
    
    
    char insertSql[100];
    snprintf(insertSql, sizeof(insertSql), "INSERT INTO students (id, name, age) VALUES (%d, '%s', %d);", id, name, age);
    
    char* errMsg;
    int rc = sqlite3_exec(db, insertSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
    
    
        fprintf(stderr, "无法插入数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
    
    
        printf("数据插入成功\n");
    }
}

// 更新数据
void updateData(sqlite3* db, int id, const char* name, int age)
{
    
    
    char updateSql[100];
    snprintf(updateSql, sizeof(updateSql), "UPDATE students SET name = '%s', age = %d WHERE id = %d;", name, age, id);
    
    char* errMsg;
    int rc = sqlite3_exec(db, updateSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
    
    
        fprintf(stderr, "无法更新数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
    
    
        printf("数据更新成功\n");
    }
}

// 删除数据
void deleteData(sqlite3* db, int id)
{
    
    
    char deleteSql[100];
    snprintf(deleteSql, sizeof(deleteSql), "DELETE FROM students WHERE id = %d;", id);
    
    char* errMsg;
    int rc = sqlite3_exec(db, deleteSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
    
    
        fprintf(stderr, "无法删除数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
    
    
        printf("数据删除成功\n");
    }
}

// 查询数据
void selectData(sqlite3* db)
{
    
    
    char* errMsg;
    const char* selectSql = "SELECT * FROM students;";
    
    int rc = sqlite3_exec(db, selectSql, selectCallback, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
    
    
        fprintf(stderr, "无法查询数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
}

int main()
{
    
    
    sqlite3* db = initDatabase();
    
    if (db)
    {
    
    
        createTable(db);
        
        insertData(db, 1, "张三", 20);
        insertData(db, 2, "李四", 22);
        insertData(db, 3, "王五", 25);
        
        selectData(db);
        
        updateData(db, 1, "赵六", 23);
        
        selectData(db);
        
        deleteData(db, 3);
        
        selectData(db);
        
        closeDatabase(db);
    }
    
    return 0;
}

この例では、initDatabaseデータベース接続が関数によって初期化され、createTable「students」というテーブルが関数によって作成されます。次に、insertData関数を使用してデータを挿入し、updateData関数を使用してデータを更新し、deleteData関数を使用してデータを削除し、関数selectDataを使用してデータをクエリし、selectCallbackコールバック関数を介してクエリ結果を処理します。

おすすめ

転載: blog.csdn.net/xiaolong1126626497/article/details/132145163