萬事俱備之後,只差與資料庫的連接,大多數的範例都是使用Entity Framework core,而這邊則是使用Dapper這個函式庫,由於專案成員比較習慣寫SQL script,而Dapper又有提供ORM(Object Relationship Mapping)意指資料欄位轉換為class的強型別對應,不像DataTable弱型別。
安裝Dapper
首先,我們打開nuget去安裝Dapper
基本設定/連接資料庫
接著,我們創建一個檔案(.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類別主要做以下事情
實作
建立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資料完美地轉換成物件以便我們去處理!