iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

目的

說明Dapper基本語法

同步更新於個人部落格
Dapper語法說明

1.建立新專案

選擇ASP.NET Core Web API專案範本,並執行下一步
步驟1

2.設定新的專案

命名你的專案名稱,並選擇專案要存放的位置。
步驟2

3.其他資訊

直接進行下一步
步驟3

4.NuGet加入套件

  • Dapper
  • Microsoft.Data.Sqlite
    步驟4

5.編輯WeatherForecastController檔案

  • 將預設的API註解
    步驟5-1
  • 基本設定
    /// <summary>
    /// 初始化SQLite
    /// </summary>
    /// <returns></returns>
    private static async Task InitSqliteAsync() {
      //建立SQLite連線
      using var conn = new SqliteConnection("Data Source=Student.sqlite");
      var SQL = new StringBuilder();
      //判斷是否有Student.sqlite檔案
      if (!System.IO.File.Exists(@".\Student.sqlite")) {
        //新增一張表,就會建立.sqlite檔案
        SQL.Append("CREATE TABLE Student( \n");
        SQL.Append("Id INTEGER PRIMARY KEY AUTOINCREMENT, \n");
        SQL.Append("Name VARCHAR(32) NOT NULL, \n");
        SQL.Append("Age INTEGER) \n");
        //執行sql語法
        await conn.ExecuteAsync(SQL.ToString());
      }
      //Task不建議使用void,當不需要回傳值時會改用Task.CompletedTask說明已經完成,可以下一個步驟了。
      await Task.CompletedTask;
    }
    public class Student {
      public int Id { get; set; }
      //Name預設值為Billhuang,與以前建構子的寫法一樣,如下方寫法
      //public Student(){Name="BillHuang";}
      public string Name { get; set; } = "BillHuang";
      public int Age { get; set; }
    }

步驟5-2

  • 寫新的對外API:ExcuteAsync
    /// <summary>
    /// ExecuteAsync可用於insert、delete、update
    /// </summary>
    /// <returns></returns>
    [HttpGet("ExcuteAsync")]
    public async Task<IActionResult> ExcuteAsync() {
      //建立SQLite連線
      using var conn = new SqliteConnection("Data Source=Student.sqlite");
      var SQL = new StringBuilder();
      //初始化SQLite
      await InitSqliteAsync();
      SQL.Append("INSERT INTO Student (Name, Age) VALUES (@Name, @Age);");
      DynamicParameters parameters = new();
      parameters.Add("Name", "BillHuang");
      parameters.Add("Age", 20);
      var Result = await conn.ExecuteAsync(SQL.ToString(), parameters);
      return Ok(Result);
    }

步驟5-3

  • 寫新的對外API:QueryAsync
    /// <summary>
    /// QueryAsync可用於select
    /// </summary>
    /// <returns></returns>
    [HttpGet("QueryAsync")]
    public async Task<IActionResult> QueryAsync() {
      //建立SQLite連線
      using var conn = new SqliteConnection("Data Source=Student.sqlite");
      var SQL = new StringBuilder();
      //初始化SQLite
      await InitSqliteAsync();
      SQL.Append("select * from Student");
      var Result = await conn.QueryAsync<Student>(SQL.ToString());
      return Ok(Result);
    }

範例5-4

  • 寫新的對外API:QueryFirstOrDefaultAsync
    取得第一筆的方法有四種,個人都是使用QueryFirstOrDefault,並判斷是否為null,如下列範例。
指令 沒有值 有一個值 有多個值
QueryFirst exception V 取第一筆
QuerySingle exception V exception
QueryFirstOrDefault null V 取第一筆
QuerySingleOrDefault null V exception
    /// <summary>
    /// 取得select第一筆
    /// </summary>
    /// <returns></returns>
    [HttpGet("QueryFirstOrDefaultAsync")]
    public async Task<IActionResult> QueryFirstOrDefaultAsync() {
      //建立SQLite連線
      using var conn = new SqliteConnection("Data Source=Student.sqlite");
      var SQL = new StringBuilder();
      //初始化SQLite
      await InitSqliteAsync();
      SQL.Append("select * from Student");
      var Result = await conn.QueryFirstOrDefaultAsync<Student>(SQL.ToString());
      if (Result is not null) {
        return Ok(Result);
      }
      return Ok(Result);
    }

範例5-5

  • 交易機制
    當有多張表需要異動時,為了確認資料的一致性,會需要透過交易機制做保護,只有全部成功或全部失敗。
    /// <summary>
    /// 交易機制,簡單說就是全部成功才算成功,不然就全部取消。
    /// </summary>
    /// <returns></returns>
    [HttpGet("TransactionsAsync")]
    public async Task<IActionResult> TransactionsAsync() {
      using var conn = new SqliteConnection("Data Source=Student.sqlite");
      //開啟連線,前面沒有這行是因為在在執行語法時(Execute、Query)會自動檢查是否連接資料庫
      conn.Open();
      //開始資料庫交易
      var trans = conn.BeginTransaction();
      var SQL = new StringBuilder();
      //初始化SQLite
      await InitSqliteAsync();
      SQL.Append("INSERT INTO Student (Name, Age) VALUES (@Name, @Age);");
      DynamicParameters parameters = new();
      parameters.Add("Name", "BillHuang");
      parameters.Add("Age", 20);
      //執行完並不會真的異動資料
      await conn.ExecuteAsync(SQL.ToString(), parameters, trans);
      SQL.Clear();
      SQL.Append("select * from Student");
      var Result = await conn.QueryFirstOrDefaultAsync<Student>(SQL.ToString(), trans);
      //當程式執行到Commit才是真的執行成功。
      trans.Commit();
      return Ok();
    }

範例5-6

範例檔

GitHub


上一篇
[.net 6] Dapper範例
下一篇
[.net 6] EFCore範例
系列文
.net6套件入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言