Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C#】【Linq to SQL】Linq to SQL によるCRUD操作

SQL ServerへのCRUD操作をちゃんと把握したく、改めて色々と調べてました。

ADO.NETによる接続ライブラリは大きく分けて3種類の模様です。

  1. DataSet

  2. Linq to SQL

  3. Entity Framework

最初は[1.]をやろうと思って調べていたんですが、なんか色々と回りくどい、面倒臭そう、取っ付きづらい、、、みたいなところがあり、もうちょっとシンプルなフレームワークとして、Linq to SQLの方をやってみた次第です。

ただ、プログラム内部からストアドとかを呼ぶなら、Datasetのほうがいいのかな……?

3.のEntityFrameworkは以前ちらっと齧ったので、またあとでいろいろと調べたいところです。

それにしてもLinq to SQLを使ってみて、何より感動したのが、事前にconnection用とデータ格納用のClassを簡単に生成できることです。

Entity FrameworkやDynamics CRM の事前バインディングを触ったことがあった身としては、これはなんとも使いやすい。

環境

Visual Studio 2013

SQL Server 2014

事前準備

一旦さらっと、Linq to SQLの事前設定を追ってみたいと思います。

1.プロジェクトに[新しい項目]から[Linq to SQL]を追加します。

f:id:sugimomoto:20150413012522p:plain

2.追加後真っ白な画面が表示されますので、dbmlファイルのデザイナー画面が表示されるので、サーバーエクスプローラーから対象のテーブルなりをドラッグアンドドロップします。

今回は以下の様なテーブルを追加してみました。(たしかSQL Server自習書のところにあったもの)

f:id:sugimomoto:20150413012504p:plain

3.以下の様な感じで、対象テーブルのクラスが作られます。 今回は社員テーブルを利用しましたが、C#内で書きやすいように各種名称を適当な英語に修正しています。

これで、データベースへのアクセスから、LinqによるCRUD操作までを完結に記述可能なClassファイルが生成されます。

f:id:sugimomoto:20150413012532p:plain

コード

というわけで、一旦CRUD操作を行うコードを記述してみました。

connectionの確率は、作成した[Linq to SQL]の名前+DatacontextクラスにConnectionStringを渡すことで接続可能です。

var dt = new UserDataContext(ConnectionString);

その上で各種CRUD操作は以下の様な感じです。

取得はDataContext.テーブル名にデータが格納されるので、Linqでデータを参照できます。

Createはテーブルクラスを元に生成したインスタンスをInsertOnSubmitに渡す。

Updateは上記DataContextから取得したデータを書き換える。

DeleteはDeleteOnSubmitに対象のテーブルクラスを渡す。

といった感じです。

ただ、SubmitChangesメソッドを実行しない限りデータベースには反映されません。

using System;
using System.Linq;

namespace MyProject.LinqToSql
{
    class Program
    {
        static void Main(string[] args)
        {
            string ConnectionString = "Data Source=XXXX;Initial Catalog=sampleDB;Integrated Security=True";

            var dt = new UserDataContext(ConnectionString);

            // Seletct
            var test = from Tables in dt.User
                       select new { Name = Tables.Name, Code = Tables.Number, Date = Tables.InputDate };

            foreach(var s in test)
            {
                Console.WriteLine("name {0}, code {1}, date {2}", s.Name, s.Code, s.Date);
            }
            Console.WriteLine();

            // Create
            User user = new User();
            user.Name = "高橋";
            user.Number = 8;

            dt.User.InsertOnSubmit(user);
            dt.SubmitChanges();

            // Update
            User updateUser = dt.User.Single(data => data.Number == 1);
            updateUser.Name = "Update Name";
            dt.SubmitChanges();
            
            // Detlete
            User deleteUser = dt.User.Single(data => data.Number == 2);
            dt.User.DeleteOnSubmit(deleteUser);
            dt.SubmitChanges();

            Console.ReadKey();
        }
    }
}

参考URL

[雑記] LINQ to SQL 実践編 (C# によるプログラミング入門)