iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
2
Modern Web

打net core肉飯系列 第 8

[2020鐵人賽] Day8 - 模型(Model)(3/3)

  • 分享至 

  • xImage
  •  

萬事俱備之後,只差與資料庫的連接,大多數的範例都是使用Entity Framework core,而這邊則是使用Dapper這個函式庫,由於專案成員比較習慣寫SQL script,而Dapper又有提供ORM(Object Relationship Mapping)意指資料欄位轉換為class的強型別對應,不像DataTable弱型別。

安裝Dapper
首先,我們打開nuget去安裝Dapper
https://ithelp.ithome.com.tw/upload/images/20200922/20111766NLkjyPrjll.png

基本設定/連接資料庫
接著,我們創建一個檔案(.cs),繼承IDisposable,他以後都負責對資料庫連接、使用dapper相關的功能,並且希望專案內任何執行SQL的操作都統一由此檔案控管,故在此類別下創建兩個方法(Query & Execute),傳入SQL語法與欄位的參數。最後,由於繼承IDisposable,必須再實作Dispose,來釋放連接。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
using Dapper;

namespace IronMan
{
    public class DataControl : IDisposable
    {
        private IDbConnection db = null;
        private string _connectStr;
        
        //建構子初始化連線字串/DB連接
        public DataControl()
        {
            string connectionStr = @"放上你的資料庫連線字串";
            _connectStr = connectionStr;
            db = new SqlConnection(_connectStr);
        }

        //共用查詢方法
        public IEnumerable<T> Query<T>(string sql,object param)
        {
            return db.Query<T>(sql, param).ToList();
        }

        //共用新增刪除修改方法
        public int Execute(string sql, object param)
        {
            return db.Execute(sql, param);
        }

        //釋放連接
        public void Dispose()
        {
            db.Dispose();
        }
    }
}

此DataControl類別主要做以下事情

  • 建構子:初始化連線字串、dbconnection。
  • Query:建立DataControl後可呼叫此方法執行Dapper的Query,主要為了在執行Dapper的Query前處理傳遞過來的參數,主要執行查詢語法,在使用LINQ的ToList回傳泛型。
  • Execute:概念同Query,主要執行新增/刪除/修改類的SQL語法。
  • Dispose:釋放連接。

實作
建立Scott Table in SQL server
我們在本機(local)資料庫新增一個名為Scott的資料表,欄位就跟我們Scott類別一模一樣。

    public class Scott
    {

        [Display(Name = "號碼")]
        public int ID { get; set; }
        [Required(ErrorMessage ="名字不可為空")]
        public string Name { get; set; }
        [Display(Name = "年齡")]
        public int Age { get; set; }
        [Display(Name = "地址")]
        public string Address { get; set; }
    }

SQL server script
創建table

CREATE TABLE Scott (
  ID INT,
  Name varchar(50),
  Age INT,
  Address varchar(255)
);

新增一筆資料

INSERT INTO Scott
VALUES(1,'AAA',18,'Kaohsiung')

這邊使用using,區塊結束後會自動執行Dispose,而id會帶一個@代表是參數,類別就選擇在上兩章使用的Scott類別當作容器

            using (DataControl dc = new DataControl())
            {
                int id = 1;
                string sql = @"SELECT * FROM Scott WHERE ID = @id";
                var result = dc.Query<Scott>(sql, new { id });//執行DataControl的Query方法
            }

之後就在result處下斷點,會發現Scott資料完美地轉換成物件以便我們去處理!


上一篇
[2020鐵人賽] Day7 - 模型(Model)(2/3)
下一篇
[2020鐵人賽] Day9 - 控制器(Controller)
系列文
打net core肉飯30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言