【C#】【Linq to SQL】Linq to SQL によるCRUD操作
SQL ServerへのCRUD操作をちゃんと把握したく、改めて色々と調べてました。
ADO.NETによる接続ライブラリは大きく分けて3種類の模様です。
最初は[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]を追加します。
2.追加後真っ白な画面が表示されますので、dbmlファイルのデザイナー画面が表示されるので、サーバーエクスプローラーから対象のテーブルなりをドラッグアンドドロップします。
今回は以下の様なテーブルを追加してみました。(たしかSQL Server自習書のところにあったもの)
3.以下の様な感じで、対象テーブルのクラスが作られます。 今回は社員テーブルを利用しましたが、C#内で書きやすいように各種名称を適当な英語に修正しています。
これで、データベースへのアクセスから、LinqによるCRUD操作までを完結に記述可能なClassファイルが生成されます。
コード
というわけで、一旦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(); } } }