--- title: .NET ORM 工具 - Dapper tags: Dapper, C#,open,helper description: 20210809 --- > [name=Jiesen] [time=20210804] [TOC] # 前言 Dapper是.Net平台的一種ORM套件,提供物件關聯對應(ORM)的功能,並且為開源軟體,其撰寫方式與ADO.NET寫法相似。 # 好處 輕量級 速度快 # 安裝 ![](https://i.imgur.com/WgZCiXf.png) 安裝前注意版本 (需要哪個版本請參考NuGet上的說明) ![](https://i.imgur.com/RaT72v3.png) ![](https://i.imgur.com/Dqi8xUe.png) # 程式範列 ```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)