---
title: .NET ORM 工具 - Dapper
tags: Dapper, C#,open,helper
description: 20210809
---
> [name=Jiesen] [time=20210804]
[TOC]
# 前言
Dapper是.Net平台的一種ORM套件,提供物件關聯對應(ORM)的功能,並且為開源軟體,其撰寫方式與ADO.NET寫法相似。
# 好處
輕量級
速度快
# 安裝

安裝前注意版本 (需要哪個版本請參考NuGet上的說明)


# 程式範列
```C#
//資料庫連線字串
private string strConnection ="Data Source=127.0.0.1;Initial Catalog=DbName;User ID=sa;Password=xxx;";
```
## 查詢範列
### Query Model
```C#
class modelA
{
public string id { get; set; }
public string name { get; set; }
}
```
```C#
private void Query(){
using (SqlConnection conn = new SqlConnection(this.strConnection))
{
string strSql = "SELECT * FROM TestTable WHERE ID=@ID AND NAME=@NAME";
DynamicParameters dictionary = new DynamicParameters();
dictionary.Add("@ID", "2");
dictionary.Add("@NAME", "a2");
IEnumerable<modelA> data= conn.Query<modelA>(strSql, dictionary);
}
}
```
### QueryFirst
QueryFirst,會將符合條件的第一筆回傳回來,如果沒有符合會拋出錯誤
```C#
using (SqlConnection conn = new SqlConnection(this.strConnection))
{
string strSql = "SELECT * FROM TestTable ";
modelA data = conn.QueryFirst<modelA>(strSql);
}
```
### FirstOrDefault
FirstOrDefault,會將符合條件的第一筆回傳回來,如果沒有符合回傳null
```C#
using (SqlConnection conn = new SqlConnection(this.strConnection))
{
string strSql = "SELECT * FROM TestTable ";
modelA data = conn.QueryFirstOrDefault<modelA>(strSql);
}
```
### SingleOrDefault
SingleOrDefault(),查詢唯一符合條件的資料,如果沒有符合回傳null,但如果符合條件為多筆時會拋出錯誤。
```C#
using (SqlConnection conn = new SqlConnection(this.strConnection))
{
string strSql = "SELECT * FROM TestTable ";
modelA data = conn.QuerySingleOrDefault<modelA>(strSql);
}
```
### QueryMultiple
QueryMultiple(),同時查詢兩段SQL,查詢回來一樣可以選擇是否要用強型別去接值。
```C#
using (SqlConnection conn = new SqlConnection(this.strConnection))
{
string strSql = "SELECT * FROM TestTable ;select * from b ";
var results = conn.QueryMultiple(strSql);
//第一段SQL
//第一次執行Read抓第一段SQL資料
var data = results.Read<modelA>().ToList();
//第二段SQL 強型別
//第二次執行Read抓第二段SQL資料
var data2 = results.Read().ToList();
//Read執行第三次會出錯
//var data3 =results.Read().ToList();
}
```
## 新增、修改、刪除範列
```C#
private void Insert() {
using (SqlConnection conn = new SqlConnection(this.strConnection))
{
string strSql = "INSERT INTO TestTable (ID,NAME) VALUES (@ID,@NAME);";
DynamicParameters dictionary = new DynamicParameters();
dictionary.Add("@ID", "1");
dictionary.Add("@NAME", "Name");
int i = conn.Execute(strSql, dictionary);
}
}
```
## 交易
```C#
private void Transactions() {
string sql = "INSERT INTO TestTable (ID,NAME) VALUES (@ID,@NAME);";
using (var connection = new SqlConnection(this.strConnection))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
try {
for (int i=1;i<10 ;i++) {
DynamicParameters Parameters = new DynamicParameters();
Parameters.Add("ID", i );
Parameters.Add("NAME", "name"+i);
var affectedRows = connection.Execute(sql, Parameters, transaction: transaction);
}
transaction.Commit();
} catch (Exception ex) {
transaction.Rollback();
}
}
}
}
```
# 參考連結
[參考網址](https://www.tpisoftware.com/tpu/articleDetails/154)
[參考網址2](https://www.tpisoftware.com/tpu/articleDetails/1046)
[教學影片](https://www.youtube.com/watch?v=p3g7mLGkqHc&list=PLJgD_fXVXZKrtBcKoWhkFl2ZaldQXav2v)
[尼克人生](https://dotblogs.com.tw/OldNick/2018/01/15/Dapper)
[dapper-tutorial](https://dapper-tutorial.net/transaction)
[教學](https://esofar.gitbooks.io/dapper-tutorial-cn/content/methods/query-first.html)
[方法說明](https://esofar.gitbooks.io/dapper-tutorial-cn/content/methods/query-first.html)