2016年2月21日日曜日

【C#】【SQLite】Linqを使用したデータ参照

目的

 Linqを使って、SQLiteのデータベースへデータ参照をする。

本記事のポイント

クラス内のフィールドにDBと対応したマッピングを記述すること。

環境

  •  Windows7
  •  Microsoft Visual Studio Community 2015
  •  SQLite 1.0.98.0

必要なもの

  • System.Data.SQLite.dll  - ①
  • SQLite.Interop.dll (←これがないと実行時エラーとなる)
  • System.Data.Linq.dll  - ②

準備

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

上記URLから「sqlite-netFx40-setup-x64-2010-1.0.99.0.exe」をダウンロードし、実行する。




ほしいものは、必要なものに記載されているDLL。
インストールされると、「C:\Program Files\System.Data.SQLite\2010\bin」あたりに配置されている。

データベースの構造

今回利用するSQLiteデータベースは下記URLからダウンロードできる。:

(「C:\temp\LinqTest.sqlite」へ配置する。)

構造
LinqTestデータベース
TestTableテーブル
カラム名
IdInteger
TitleText
DetailText

手順

  1. コンソールアプリケーションプロジェクトを新規作成する。
  2. 「参照」に①②を追加する。
  3. テーブルとマッピングするクラスを追加する。
  4. テーブルからデータを取得する。
  5. 確認

1.コンソールアプリケーションプロジェクトを新規作成する。

「ファイル」-「新規作成」-「プロジェクト」を選び、コンソールアプリケーションを選択し、OKを押す。

2.「参照」に①②を追加する。


3.テーブルとマッピングするクラスを追加する。

プロジェクトへクラスを追加する。名前は「TTestData.cs」とする。そのクラスへ「using System.Data.Linq.Mapping;」を追加する。クラスのソース全文は以下に示す。
using System;
using System.Data.Linq.Mapping;

namespace LinqTest
{
    [Table(Name="TestTable")]
    class TTestData
    {
        //ID
        [Column(Name = "Id", DbType = "INT", CanBeNull = true, IsPrimaryKey = false)]
        public Int32? Id { get; set; }

        // Title
        [Column(Name ="Title",DbType ="NVARCHAR", CanBeNull =true)]
        public String Title { get; set; }

        // Detail
        [Column(Name ="Detail",DbType ="NVARCHAR", CanBeNull =true)]
        public String Detail { get; set; }
    }
}

4.テーブルからデータを取得する。

プロジェクトを新規作成した際に自動的に作成されている「Program.cs」のMainメソッドへ、テーブルからデータを取得し、標準出力するためのLinq等のソースを記述する。

usingは以下を追加する。

  • using System.Data.Linq;
  • using System.Data.SQLite;
  • using System.Linq;
using System;
using System.Data.Linq;
using System.Data.SQLite;
using System.Linq;

namespace LinqTest
{
    class Program
    {
        static void Main(string[] args)
        {
            SQLiteConnectionStringBuilder aConnectionString = new SQLiteConnectionStringBuilder
            {
                DataSource = @"C:\temp\LinqTest.sqlite" // データベースの保存先
            };
            using (SQLiteConnection aConnection = new SQLiteConnection(aConnectionString.ToString()))
            {
                // データベースを開く
                aConnection.Open();

                // ここにデータベース処理コードを書く
                using(DataContext aContext = new DataContext(aConnection))
                {
                    Table aTableTest = aContext.GetTable();
                    IQueryable aQueryResult =
                        from x in aTableTest
                        select x;

                    Console.WriteLine("=== test ===");
                    foreach(TTestData aData in aQueryResult)
                    {
                        Console.WriteLine("=== {0} ===", aData.Id);
                        Console.WriteLine(aData.Title);
                        Console.WriteLine(aData.Detail);
                    }

                    Console.ReadLine(); // Enterキー押下でコマンドプロンプトが閉じる
                }
                // データベースを閉じる
                aConnection.Close();
            }
        }
    }
}

5.確認

以下のようにコマンドプロンプトが表示されればOK。