internal List <UserEntity> GetList() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); var param = new { // IN句に並べたい値をリストとして積んでやる AgeList = new List <int>() { 20, 38 } }; // 上ではジェネリックリストにしているが、配列でもOK //var param = new //{ // AgeList = new int[] { 20, 38 } //}; return(cn.Query <UserEntity>("SELECT * FROM Users WHERE Age IN @AgeList ORDER BY ID", param).ToList()); } }
// transactionを開始して、commitして正常に終わるパターンの例 internal void UpdateCommitOK(UserEntity data) { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // 通常のADO.NETと同様、トランザクションを開始する var tr = cn.BeginTransaction(); try { // Execute拡張メソッドの第三引数:transactionに開始したトランザクションをセット cn.Execute(" UPDATE Users " + " SET " + " FirstName = @FirstName , " + " LastName = @LastName , " + " Email = @Email , " + " Age = @Age " + " WHERE " + " Id = @ID ", data, tr); // 通常通り、コミットすればOK tr.Commit(); } catch (Exception) { // 例外の場合等は、ロールバックする。 tr.Rollback(); } } }
internal UserEntity GetDetail(int Id) { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); return(cn.Query <UserEntity>("SELECT * FROM Users WHERE Id = @ID ", new { ID = Id }).FirstOrDefault()); } }
internal List <UserEntity> GetList() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); return(cn.Query <UserEntity>("SELECT * FROM Users ORDER BY ID").ToList()); } }
internal int GetCount() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // スカラ値を取得する例 return(cn.Query <int>("SELECT Count(*) FROM Users").Single()); } }
internal void UpdateMultiRow() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // リストを作って渡してやる var param = new List <UserEntity>() { new UserEntity() { FirstName = "氏1111", LastName = "名1111", Age = 11 }, new UserEntity() { FirstName = "氏22222", LastName = "名22222", Age = 22 }, new UserEntity() { FirstName = "氏33333", LastName = "名33333", Age = 33 }, }; // 配列でもOK //var param = new[] //{ // new // { // FirstName = "氏1111", // LastName = "名1111", // Age = 11 // }, // new // { // FirstName = "氏22222", // LastName = "名22222", // Age = 22 // }, // new // { // FirstName = "氏33333", // LastName = "名33333", // Age = 33 // }, //}; cn.Execute("UPDATE Users SET FirstName = @FirstName , LastName = @LastName WHERE Age = @Age ", param); } }
internal List <UserEntity> GetListByRecord() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // SQL Serverのストアドでレコードが帰ってくる場合、普通にQuery拡張メソッドを実行すれば良い。 // (commandTypeは一応書いているが、省略しても多分通る。) return(cn.Query <UserEntity>("GetOlderUserByRecordProc", new { baseAge = 24 }, commandType: System.Data.CommandType.StoredProcedure).ToList()); } }
internal List <UserEntity> GetList() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // Query拡張メソッドに型引数を渡すと、その型にマッピングする。 // 戻り値はIEnumerable<UserEntity>となる return(cn.Query <UserEntity>("SELECT * FROM Users ORDER BY ID").ToList()); } }
internal void Delete(int id) { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); cn.Execute(" DELETE Users " + " WHERE " + " Id = @ID ", new { ID = id }); } }
internal UserEntity GetDetail(int Id) { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // パラメタライズドクエリでパラメータを設定する場合、 // 第二引数(param)に『バインド変数名と同じ名前のメンバ』を持ったオブジェクトを渡す。 // この例のように、匿名オブジェクトでもOK。 return(cn.Query <UserEntity>("SELECT * FROM Users WHERE Id = @ID ", new { ID = Id }).FirstOrDefault()); } }
internal List <dynamic> GetList() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // Query拡張メソッドで型引数を指定しない。 // 戻り値はIEnumerable<dynamic>となる // dynamicの中身(?)は、クエリ結果のカラムと同名/同型のメンバを持ったオブジェクトとなる。 return(cn.Query("SELECT Id, FirstName , LastName ,Email , Age FROM Users ORDER BY Id").ToList()); } }
internal int GetCountByOutParam() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // 基本的にはGetCountByReturn()のケースと同様。 // outputパラメータで値を受け取る場合は引数directionにSystem.Data.ParameterDirection.Outputを設定。 var param = new DynamicParameters(new { baseAge = 24 }); param.Add("count", 0, direction: System.Data.ParameterDirection.Output); cn.Execute("GetCountOlderByOutputParamProc", param, commandType: System.Data.CommandType.StoredProcedure); return(param.Get <int>("count")); } }
internal void Create(UserEntity data) { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // パラメタライズドクエリでパラメータを設定する場合、その3. // バインドに使用しないメンバが存在しても問題ない // (今回の場合、data.IDは使用しない為不要だが、あってもエラーにならない cn.Execute(" INSERT INTO Users " + " (FirstName , LastName , Email , Age) " + " VALUES " + " (@FirstName , @LastName , @Email, @Age )", data); } }
internal List <UserFavoriteBookEntity> GetRecords1() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // 型引数を複数与える。 // 型引数には、SELECT句の前から順に、カラムをマップする方を指定。 // (splitOn引数で指定した名前のカラムで分割し、それぞれの型にマップする。) // 最後の型引数は、最終的に返却する型を指定する。 // // map引数には、マッピングするアルゴリズムをラムダで記述する。 // 引数の型と数と順番は、Query拡張メソッドの型引数で指定した順(最後の一つは除く) // ラムダ式の戻り値は、Query拡張メソッドの型引数の最後に指定したものになるようにする。 // // splitOnには結果列の区切りなるカラム名を指定する。 // 複数ある場合は、カンマで区切る。 // 同名であっても数が合っていればよしなにやってくれる。 var ret = cn.Query <UserFavoriteBookEntity, UserEntity, BooksEntity, UserFavoriteBookEntity>( " SELECT " + " f.Id, " + " u.Id, " + " u.FirstName, " + " u.LastName, " + " u.Email, " + " u.Age, " + " b.Id, " + " b.Name " + " FROM " + " UserFavoriteBook f left join " + " Users u on f.UserID = u.Id Left Join " + " Books b on f.BookID = b.id", map: (uf, user, book) => { uf.User = user; uf.InterstBook = book; return(uf); }, splitOn: "Id,Id" ).ToList(); return(ret); } }
internal void Update(UserEntity data) { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // パラメタライズドクエリでパラメータを設定する場合、その2. // 当然、匿名型ではなく名前を持った型も設定可能. // // なお、UPDATE/INSERT/DELETE等、結果列を返さないクエリの実行はExecute拡張メソッドを利用する。 cn.Execute(" UPDATE Users " + " SET " + " FirstName = @FirstName , " + " LastName = @LastName , " + " Email = @Email , " + " Age = @Age " + " WHERE " + " Id = @ID ", data); } }
internal int GetCountByReturn() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // パラメータにIN/OUT等細かな設定が必要な場合は、 // DynamicParametersのインスタンスを作ってそこに設定してやればよい模様。 // 細かな設定が要らないパラメータ(入力専用等)は、コンストラクタに纏めて渡してやればよさそう var param = new DynamicParameters(new { baseAge = 24 }); // 値の受け取りなど個別の設定が必要な場合は、一つ一つ設定。 // 設定内容は、System.Data.Common.DbParameterに設定する内容に準じる。 // ストアドの戻り値を受け取る場合は、引数directionにSystem.Data.ParameterDirection.ReturnValueを設定。 param.Add("result", 0, direction: System.Data.ParameterDirection.ReturnValue); // Execute拡張メソッドで実行。引数commandTypeにSystem.Data.CommandType.StoredProcedureを設定してやる。 cn.Execute("GetCountOlderByRerutnProc", param, commandType: System.Data.CommandType.StoredProcedure); return(param.Get <int>("result")); } }
internal void InsertMultiRow() { using (var cn = DbConnectionUtil.GetConnection()) { cn.Open(); // リストを作って渡してやる var param = new List <UserEntity>() { new UserEntity() { FirstName = "氏1", LastName = "名1", Email = "*****@*****.**", Age = 11 }, new UserEntity() { FirstName = "氏2", LastName = "名2", Email = "*****@*****.**", Age = 22 }, new UserEntity() { FirstName = "氏3", LastName = "名3", Email = "*****@*****.**", Age = 33 }, }; // 配列でもOK //var param = new[] //{ // new // { // FirstName = "氏1", // LastName = "名1", // Email = "*****@*****.**", // Age = 11 // }, // new // { // FirstName = "氏2", // LastName = "名2", // Email = "*****@*****.**", // Age = 22 // }, // new // { // FirstName = "氏3", // LastName = "名3", // Email = "*****@*****.**", // Age = 33 // }, //}; cn.Execute("INSERT INTO Users (FirstName,LastName,Email,Age ) VALUES (@FirstName,@LastName,@Email,@Age) ", param); } }