mikeo_410


System.Data.Sqlite、Linq

注意:OSがx64の場合は、構成マネージャーでソリューションプラットフォームをx86に設定してください。

1.単に System.Data.Sqlite.dll を参照に追加する

  これは、上手く使えませんでした。デバッガで追うことができません。

  以下で上手く行っている例は、自動生成されるコードを使ったもので、方法が違います。
  インストールしない方法でも、自動生成する分を補えば上手くいく可能性はあると思います。
  上手くいかなかった方法は以下のものです。

  1. System.Data.SQLite.SQLiteConnection con
  2.     = new SQLiteConnection(©"DbLinqProvider=Sqlite; Data Source=Lumad.sqlite");
  3. SQLiteCommand cmd = new SQLiteCommand("select * form menu_items;",con);
  4. con.Open();
  5. SQLiteDataReader reader = cmd.ExecuteReader();
  6. bool b=reader.Read();
  7. object o = reader.GetValue(0);

2.セットアップでデザインタイムサポートを有効に


  インストーラーの付いたものをダウンロードして、インストールして見ました。

  インストールの最後に左図の表示が出ます。
  ここで、チェックをすることが要点でした。

  デフォルトのまま、未チェックのままインストールすると、「参照の追加」の際の選択肢に追加が行われません。

  DLLを指定して「参照の追加」をしても、インストールしないで使おうとしたときと同じで上手くいきませんでした。

3.XSD の生成

  前述のインストールの結果として、Visual Studio の「新しいデータソースの追加」ができます。
  「JPN.mdbの読み取り」の「新しいデータソースの追加」の手順の中で、データソースに「SQLite Database file」が選択可能になっています。

  ここで自動生成されるクラスを使って以下のようにアクセスできます。

  1. lumadDataSetTableAdapters.menu_itemsTableAdapter
  2.     adapter = new WpfApplication2.lumadDataSetTableAdapters.menu_itemsTableAdapter();
  3. lumadDataSet.menu_itemsDataTable table = new lumadDataSet.menu_itemsDataTable();
  4. adapter.Fill(table);
  5. for (int i = 0; i < table.Rows.Count; i++)
  6.     Debug.WriteLine(table.Rows[i][0]+" "+table.Rows[i][2]);

5.Linq

  Linq がなんなのか良くわかりませんが、以下のようにしてもアクセスできます。

  1. var conn = new SQLiteConnection("DbLinqProvider=Sqlite; Data Source=lumad.sqlite");
  2. var db = new DataContext(conn);
  3. var rows = from row in db.GetTable<_MenuItems>() where row.Id != 0 select row; 
  4. foreach (var r in rows) 
  5.     Debug.WriteLine(r.Name);

  ただし、_MenuItems は、以下のように手書きしており、これを作る方法はわかりません。

  1. [Table(Name = "menu_items")]
  2. public class _MenuItems
  3. {
  4.     [Column(Name = "id", IsPrimaryKey = true)]
  5.     public int Id;
  6.     [Column(Name = "menu_id")]
  7.     public int MenuId;
  8.     [Column(Name = "name")]
  9.     public string Name;
  10.     [Column(Name = "url")]
  11.     public string Url;
  12.     public override string ToString()
  13.     {
  14.         return Id +" "+ MenuId + " " + Name + " " + Url;
  15.     }
  16. }

6.2つのテーブルのクエリ

  ここで使っているデータベースは、このホームページそのものです。
  このデータベースは2つのテーブルがあります。_MenuItems テーブルに、_ContentPages へのインデクスがあって、関連付けられています。、_ContentPages の変更日時(Modified)で、新しい、ペアを選択するのを試してみました。

  1. var con = new SQLiteConnection("DbLinqProvider=Sqlite; Data Source=lumad.sqlite");
  2. var db = new DataContext(con);
  3. var rows = from i in db.GetTable<_MenuItems>() join c in db.GetTable<_ContentPages>()
  4.            on i.ContentPageId equals c.Id where c.Modified >new DateTime(2009,9,1) 
  5.            orderby c.Modified
  6.            select new { i.Name, i.Url, c.Modified};
  7. foreach (var o in rows)
  8.     Debug.WriteLine(o.Name + " " + o.Url + " " + o.Modified);


mikeo_410@hotmail.com