Gtk3アプリ Sqliteを使う

### nugetからSqliteライブラリをインストール
<img width="300" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/6badad8a-8d60-fe32-23fa-f9397b6f5509.png">

Sqliteでよく使われているライブラリはMicrosoft.Data.SqliteとSystem.Data.Sqliteがあります。
System.Data.SqliteはSqlite本家のライブラリでWindowsでよく利用されます。Linux版はNugetから入れてみるとNotFoundException SQLite.Interop.dllとエラーが出ます。Linuxで利用するにはSystem.Data.SQLiteのソースをダウンロードし、コンパイルしてからインポートしないといけないようです。

[参考](http://ja.uwenku.com/question/p-ddcjfgbm-ov.html)
[F#からSQLiteをつかってみる](https://qiita.com/callmekohei/items/8b051126de965f14f7a9)
#### Microsoft.Data.Sqliteを使う

Microsoft.Data.Sqliteはnugetからそのまま使えるのでMicrosoftのものを使います。

[Microsoft.Data.Sqlite.Core](https://www.nuget.org/packages/Microsoft.Data.Sqlite.Core/6.0.0-preview.4.21253.1)

```
Install-Package Microsoft.Data.Sqlite.Core -Version 5.0.6
//SQLitePCLRawも入れる必要あり
Install-Package SQLitePCLRaw.bundle_e_sqlite3 -Version 1.1.9
```

EntityFrameworkを利用したり暗号化したりする場合は以下のライブラリもインストールしないとエラーになります。
SQLitePCLRaw.bundle_e_sqlite3はMicrosoft.Data.Sqliteの利用に必須です。

```
Install-Package SQLitePCLRaw.bundle_e_sqlite3 -Version 1.1.9
Install-Package Microsoft.EntityFrameworkCore.Sqlite.Core -Version 5.0.6
Install-Package SQLitePCLRaw.bundle_sqlcipher -Version 1.1.9
Install-Package SQLitePCL.bundle_green -Version 0.9.3
```

[参考](http://muchag.undo.jp/archives/3288)

### Dapperをインストール
Nugetで検索してインストールする
<img width="350" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/91aabc7e-3107-a8ca-33a3-a333dd47ff08.png">

```
Install-Package Dapper
```


[Dapper](https://www.nuget.org/packages/Dapper/)
### Dapper Extensionをインストール
Dapper Extensionは種類が多いため、検索して人気のあるダウンロード数の多いものをインストールする
<img width="400" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/ee19f71f-a514-1852-dc8b-c094fc4dc38f.png">

```
Install-Package DapperExtensions
```

[DapperExtensions](https://www.nuget.org/packages/DapperExtensions/)

#### Dbテストサンプル

RiderのDBの支援機能でDbファイルとテーブルを作成した後で

```cs
using System;
using Dapper;
using DapperExtensions;
using Microsoft.Data.Sqlite;

namespace sqlConsoleApp1
{
    class Program
    {
        public　class test {
            public int id { get; set; }
            public string code { get; set; }
            public string name { get; set; } 
        }
        
        static void Main(string[] args)
        {
            
            SqliteConnectionStringBuilder b = new SqliteConnectionStringBuilder();
            b.DataSource = "./test.db";
            
            SqliteConnection con = new SqliteConnection(b.ConnectionString);
　          //SQL形式で書き出す
            DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();

            con.Open();
            //dapperで_を有効にする
            Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

            //外部キーの設定
            SqliteCommand command = con.CreateCommand();
            command.CommandText = "PRAGMA foreign_keys = ON;";
            command.ExecuteNonQuery();

            string sql = "select * from test;";
            
            var result = con.Query<test>(sql);
            
            foreach(var p in result) {
                Console.WriteLine("ID:" + p.id + " 名:" + p.name);
            }

            test test1 = new test();
            test1.name = "2";
            test1.code = "java";
            con.Insert<test>(test1);

            string sql3 = "select * from test Where name = '2';";
            var test_result2 = con.QueryAsync<test>(sql3);
            Console.WriteLine(test_result2.Result);   

            con.Close();         
        }
    }
}
```

#### DapperExtensions 1.7.0

 1.7.0から非同期処理ができるようになりました。
 
```
  test test1 = new test();
  test1.name = "1";
  test1.code = "java"; 
           
  con.InsertAsync(test1);
```

### Riderのデータベース支援機能を使う
データベースウィンドウの＋ボタンからデータベース接続画面を開く
<img width="450" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/301cbded-f31a-c488-20e6-c8a14235046a.png">

様々なDBの接続に対応している。Sqliteを選択
<img width="350" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/1b8d7e0d-fa9a-2013-2acb-596577ab88fc.png">
外部キーの設定ができる
<img width="350" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/5b324566-6577-d336-4133-f7a4654a2be3.png">
データの編集
<img width="350" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/7a57d3c4-926a-9c8c-f0d9-cb0750953a0a.png">

### Dbからモデルファイルを自動生成する

https://github.com/olsh/datagrip-poco-generator

<img width="500" alt="Screenshot from 2021-08-11 14-10-41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/a505da25-1adf-bc1c-5e64-0912ff5412fe.png">

Generate POCO.groovyをダウロードします。インターフェースを作る場合はGenerate IPOCO.groovyを

##### Generate POCO.groovyをコピー

データーベース ー 右クリック ー スクリプト拡張 ー スクリプトディレクトリに移動

<img width="500" alt="aaaa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/862a4d93-5198-a7d8-0db8-19f53555faa9.png">

<img width="300" alt="Screenshot from 2021-08-11 14-28-47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/6a1add6c-5ae0-925c-181f-2b3abcf6fbaa.png">

schema ー 右クリック ー Files ー POCO.groovyをコピー

モデルファイルが生成させる
<img width="300" alt="Screenshot from 2021-08-11 14-32-23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/538ac75d-cd90-c26d-8451-74740a1a2d16.png">
##### 追記　DBのカラム名をそのまま使えるように修正

Generate POCO.groovy

```
Generate POCO.groovy
name : csharpName(col.getName()),
↓
name : col.getName(),
```
csharpNameをすべて取る。

###### typeMappingにパターンを追加しDBの型を抽出できるようにする

```
typeMapping = [
        (~/(?i)^bit|bool$/)                                    : "bool",
```

[モデル生成Script](https://github.com/iotagtk1/gladeGenerator/blob/main/gladeGenerator/Script/Generate%20IPOCOsCustom.groovy)

[Gtk3アプリ RiderとOpenApi](https://qiita.com/tana_/items/08ce849a580b8c71a875)に続く