c# でSQLteをかんたんに使う方法

この記事のまとめ

テーブルを作成するには、DB Browser for SQLiteを使う方が簡単で手っ取り早いです

ライブラリは System.Data.SQLite を使います

SELECTやINSERTなどのコードは以下を参照。

使用するライブラリ

ライブラリはSystem.Data.SQLiteを使います。System.Data.SQLite.Coreでも問題ありませんが、ディスク容量をあまり気にする必要がない場合は、System.Data.SQLiteの方が無難です

https://www.nuget.org/packages/System.Data.SQLite/

以下のコマンドでさくっとプロジェクトに追加しましょう。

dotnet add package System.Data.SQLite --version 1.0.114.4

テーブルを作成する方法

テーブルを作成するには、CREATE TABLE を使う方法も考えられますが、DB Browser for SQLiteを使う方法が一番かんたんです。

DB Browser for SQLite は https://sqlitebrowser.org/ からダウンロードが可能です。

DB Browser for SQLiteを起動し、New Databaseをクリックします。

データベースファイルの保存先を指定し、データベースファイルを作成します。

テーブル定義画面が表示されます。Add Fieldをクリックして、項目を作成します。

データ属性は以下から選択します。

  • INTEGER
  • TEXT
  • BLOB
  • REAL
  • NUMERIC

最後にOKボタンをクリックしてテーブルを作成できたら完了です。

下準備

必要な下準備は2つあります。

1つは、テーブル定義と同等のデータクラスを作成すること。以下のような感じですね。



        public class Data
        {
            public string URL {get; set;}
            public string Title {get; set;}
            public int Status404 {get; set;}
            public int PageView {get; set;}
            public int ProcessFlag {get; set;}
        }

2つ目は、DBファイルパスを保存する変数を共通的に使えるようにしておくことです。いろんな関数で使いますので。


    public static string dataSource = @"./Input/filelist.db";

レコードをINSERTする方法

引数にテーブル定義と同等のデータクラスであるDataを持たせています。

この関数の欠点は、シングルクォートのエスケープ処理をしていないことです。INSERT項目にシングルクォートが含まれている場合はエラーになります。。。

dataSourceは、DBファイルパス(string型)です。



    /// <summary>
    /// レコードを1件インサートする
    /// </summary>
    /// <param name="data">インサートデータ</param>
    public static void AddRecord(Data data)
    {
        var sqlConnectionSB = new SQLiteConnectionStringBuilder{DataSource = dataSource};

        using(var cn = new SQLiteConnection(sqlConnectionSB.ToString()))
        {
            cn.Open();

            string sql = $"INSERT  INTO  FileList values ('{data.URL}', '{data.Title}', {data.Status404}, {data.PageView}, {data.ProcessFlag})";
            SQLiteCommand cmd = new SQLiteCommand(sql, cn);
            cmd.ExecuteNonQuery();

        }
    }

SELECTで全件抽出する方法

List型のDataクラスを返す引数にしています。複数レコードが返却されても、Listで柔軟に操作できるようにしています。



    /// <summary>
    /// FileListテーブルのレコードを取得する
    /// </summary>
    /// <param name="sql">SELECT SQL文字列</param>
    /// <returns></returns>
    public static List<Data> GetData(string sql)
    {
        List<Data> allData = new List<Data>();
        Data record = new Data();

            var sqlConnectionSB = new SQLiteConnectionStringBuilder{DataSource = dataSource};

        using(var cn = new SQLiteConnection(sqlConnectionSB.ToString()))
        {
            cn.Open();
            SQLiteCommand cmd = new SQLiteCommand(sql, cn);

            SQLiteDataReader sdr = cmd.ExecuteReader();

            while(sdr.Read() == true)
            {
                record = new Data();

                record.URL = (string)sdr["URL"];
                record.Title = (string)sdr["Title"];
                record.Status404 = Convert.ToInt32((decimal)sdr["Status404"]);
                record.PageView = Convert.ToInt32((decimal)sdr["PageView"]);
                record.ProcessFlag = Convert.ToInt32((decimal)sdr["ProcessFlag"]);

                allData.Add(record);
            }

        }

        return allData;
    }

レコードをUPDATEする方法



    /// <summary>
    /// レコードを1件更新する
    /// </summary>
    /// <param name="data">更新データ</param>
    public static void UpdateRecord(DataModel.pagelist.Data data)
    {
        var sqlConnectionSB = new SQLiteConnectionStringBuilder{DataSource = dataSource};

        using(var cn = new SQLiteConnection(sqlConnectionSB.ToString()))
        {
            cn.Open();

            string sql = $"Update  FileList set Title = '{data.Title}' , Status404 = {data.Status404}, PageView = {data.PageView}, ProcessFlag = {data.ProcessFlag}  where  URL = '{data.URL}'";
            SQLiteCommand cmd = new SQLiteCommand(sql, cn);
            cmd.ExecuteNonQuery();

        }
    }

レコードをDELETEする方法



    /// <summary>
    /// FileListテーブルのデータを全件削除する
    /// </summary>
    public static void DeleteAllRecordFileList()
    {

        var sqlConnectionSB = new SQLiteConnectionStringBuilder{DataSource = dataSource};

        using(var cn = new SQLiteConnection(sqlConnectionSB.ToString()))
        {
            cn.Open();

            string sql = $"DELETE  FROM  FileList";
            SQLiteCommand cmd = new SQLiteCommand(sql, cn);
            cmd.ExecuteNonQuery();
        }

    }

速攻でメモできる QuickNote リリースしました!

QuickNoteは動作が超軽量でサクサクかけるノートアプリです。一瞬の閃きを逃さずにノートを開き書き始めることができます。 アカウント登録も不要です。お試しあれ!

Excel操作をコマンドで! proBoarderExcel

Excelはマウスで操作するのが基本ですが、マウス操作に疲れてはいませんか? キーボードでExcel操作ができるようになるアプリです。オープンソースで無料です。

積み上げ! Daily Stack リリースしました!

Daily Stack は日々の積み上げを管理するToDoアプリです。過去の積み上げの振り返りだけでなく、ツイート機能もあります。 アカウント登録不要ですぐに使い始めることができます。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱