一般CRUD情境

假設要新增、修改使用者的證照清單,操作範例如下:

  • 證照清單 Model 依據資料表License建立一個Model為TLicense
    namespace TestService.Models
    {
        /// <summary>
        /// 證照資料
        /// </summary>
        public class TLicense
        {
            /// <summary>
            /// 流水號
            /// </summary>
            public int no { get; set; }
            /// <summary>
            /// 證照種類
            /// </summary>
            public string licn_typ { get; set; }
            /// <summary>
            /// 證照名稱
            /// </summary>
            public string licn_name { get; set; }
            /// <summary>
            /// 發照單位
            /// </summary>
            public string licn_unit { get; set; }
        }
    }
    
  • 新增
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                TLicense license = new()
                {
                    licn_typ = "證照種類",
                    licn_name = "證照名稱",
                    licn_unit = "發照單位"
                };
                var InsertSql = @"INSERT INTO License([licn_typ],[licn_name],[licn_unit])
    		                      VALUES(@licn_typ, @licn_name, @licn_unit)";
                var parameters = new DynamicParameters(license);
                var result = connection.Execute(InsertSql, parameters, transaction);
    
                // 提交事務
                transaction.Commit();
            }
            catch (Exception ex)
            {
                // 發生例外,回滾事務
                transaction.Rollback();
                // 處理例外
                // ...
            }
        }
    }
    
  • 修改
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                TLicense license = new()
                {
                    licn_typ = "證照種類",
                    licn_name = "證照名稱",
                    licn_unit = "發照單位"
                };
                var UpdatetSql = @"Update License
                                      Set [licn_typ] = @licn_typ,
                                          [licn_name] = @licn_name,
                                          [licn_unit] = @licn_unit
    		                        Where [no] = @no";
                var parameters = new DynamicParameters(license);
                var result = connection.Execute(InsertSql, parameters, transaction);
    
                // 提交事務
                transaction.Commit();
            }
            catch (Exception ex)
            {
                // 發生例外,回滾事務
                transaction.Rollback();
                // 處理例外
                // ...
            }
        }
    }
    

使用Dapper.Contrib

接下來是使用Dapper.Contrib CRUD的範例

  • 證照清單 Model 依據資料表License建立一個Model為TLicense

    using Dapper.Contrib.Extensions;
    namespace TestService.Models
    {
        /// <summary>
        /// 證照資料
        /// </summary>
        [Table("License")]
        public class TLicense
        {
            /// <summary>
            /// 流水號
            /// </summary>
            [Key]
            public int no { get; set; }
            /// <summary>
            /// 證照種類
            /// </summary>
            public string licn_typ { get; set; }
            /// <summary>
            /// 證照名稱
            /// </summary>
            public string licn_name { get; set; }
            /// <summary>
            /// 發照單位
            /// </summary>
            public string licn_unit { get; set; }
        }
    }
    
    • 添加 [Table(“TableName”)] 以便對應正確的資料表,才不會在做Contrib CRUD出現問題
    • 於欄位 no 加上[key], 因為此欄位是自動編號
  • 新增

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                TLicense license = new()
                {
                    licn_typ = "證照種類",
                    licn_name = "證照名稱",
                    licn_unit = "發照單位"
                };
                var result = connection.Insert(license, transaction);
    
                // 提交事務
                transaction.Commit();
            }
            catch (Exception ex)
            {
                // 發生例外,回滾事務
                transaction.Rollback();
                // 處理例外
                // ...
            }
        }
    }
    
  • 修改

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                TLicense license = new()
                {
                    no = 1
                    licn_typ = "證照種類",
                    licn_name = "證照名稱",
                    licn_unit = "發照單位"
                };
                var result = connection.Update(license, transaction);
    
                // 提交事務
                transaction.Commit();
            }
            catch (Exception ex)
            {
                // 發生例外,回滾事務
                transaction.Rollback();
                // 處理例外
                // ...
            }
        }
    }
    
  • 刪除

      using (var connection = new SqlConnection(connectionString))
      {
          connection.Open();
          using (var transaction = connection.BeginTransaction())
          {
              try
              {
                  TLicense license = new()
                  {
                      no = 1
                  };
                  var result = connection.Delete(license, transaction);
    
                  // 提交事務
                  transaction.Commit();
              }
              catch (Exception ex)
              {
                  // 發生例外,回滾事務
                  transaction.Rollback();
                  // 處理例外
                  // ...
              }
          }
      }
    
  • 查詢

      using (var connection = new SqlConnection(connectionString))
      {
          connection.Open();
          using (var transaction = connection.BeginTransaction())
          {
              try
              {
                  TLicense license = new()
                  {
                      no = 1
                  };
                  var result = connection.Get<TLicense>(license.no, transaction);
    
                  // 提交事務
                  transaction.Commit();
              }
              catch (Exception ex)
              {
                  // 發生例外,回滾事務
                  transaction.Rollback();
                  // 處理例外
                  // ...
              }
          }
      }
    

結論

Dapper.Contrib 省下我們寫SQL指令以及參數設定簡化,當然這些是比較單純的狀況下很好運行,還是得視專案功能需求來調整使用的時機。