前回SQLを使って交差テーブル(中間テーブル・関連テーブル)の内容を列挙しましたが、今回はその問い合わせ結果をC#から呼び出してみたいと思います。
前回の記事で使用した以下のテーブル定義とデータは既にファイルに保存してあるものとします。
実施環境
- Windows10
- Sqlite3 ver.3.27.2
- コマンドラインで確認
- C# 7.2
- VisualStudio2017
- .NET Core2.2
- nuget System.Data.SQLite.Core (ver.1.0.110)
交差テーブルからリストを取得
using System; using System.Collections.Generic; using System.Data.Common; using System.Data.SQLite; internal class AppMain { public static void Main(string[] args) { // こういう問い合わせ結果になるはずなので // 対応する型Userを用意する // user_id name // ---------- ---------- // 10000 太郎 // 10001 一郎 // 10002 次郎 var userList = new List<User>(); Context(CreateCon, cmd => { // ブログIDが"1"のユーザーIDと名前を列挙する cmd.CommandText = "SELECT C.user_id, C.name " + "FROM (blogs A INNER JOIN authors B ON A.blog_id = B.blog_id) " + "INNER JOIN users C ON B.user_id = C.user_id " + "WHERE A.blog_id = 1;"; using (var r = cmd.ExecuteReader()) { r.Read(); while (r.Read()) { for (int i = 0; i < r.FieldCount; i++) { userList.Add(new User() { ID = r.GetFieldValue<long>(0), Name = r.GetFieldValue<string>(1), }); } } } }); userList.ForEach(user => Console.WriteLine($"{user.ID}, {user.Name}")); } public static void Context(DbConnectionStringBuilder b, Action<SQLiteCommand> func) { using (var con = new SQLiteConnection(b.ToString())) { con.Open(); using (var command = new SQLiteCommand(con)) { func(command); } } } public static DbConnectionStringBuilder CreateCon => new SQLiteConnectionStringBuilder() { DataSource = @"C:\xxxx\sample.db" }; } public class User { public long ID { get; set; } public string Name { get; set; } }
これでリストにデータが取得できました。
リストに値を追加するのは以下操作を行うだけなので割愛します。 * トランザクションをBeginTransaction()で開始 * users テーブルに新しいデータを INSERT INTO をExecuteNonQuery * authore テーブルに ↑ で追加したデータを INSERT INTO をExecuteNonQuery * 変更をTransaction.Commit()でコミット
簡単ですが以上です。