ORM:對象關係映射器,它直接將數據庫映射到C#對象。git
有不少ORM框架可用,Dapper是其中之一,被稱爲ORM之王。github
下面是Dapper主要的一些功能:數據庫
爲何選擇Dapperc#
圖片參照: Dapper dotnet.數組
如何安裝Dapperapp
在Visual Studio中,建立一個新的控制檯項目,並在解決方案資源管理器中右鍵單擊引用,選擇 「管理Nuget包...」包管理器,而後搜索Dapper,並使用NuGet包管理器控制檯命令「install-package Dapper」,這將在項目中安裝Dapper。框架
Dapper如何工做ide
主要包含三個步驟性能
第一步:使用鏈接字符串建立一個IDBConnection對象;spa
第二步:編寫一個查詢並將其存儲在一個普通的字符串變量中;
第三步:調用db.execute()並傳遞查詢,完成。
在下面的示例中,咱們還將探索許多其餘的方法。
對於本例,我有一個名爲「ContactDB」的數據庫,庫中包含一個名爲「Contacts」的表,讓咱們使用Dapper對Contacts表進行CRUD操做。
建立一個控制檯應用程序並安裝Dapper,幷包含Dapper的命名空間。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Dapper; namespace DapperORMBlog { public class Program { static void Main(string[] args) { } } }
示例1:
獲取全部數據並打印到控制檯
第一步:建立IDbConnection類的對象和SqlConnection的新實例。
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
SqlServerConnString是鏈接字符串名稱,能夠配置在程序中的App.config中。
<connectionStrings> <add name="SqlServerConnString" providerName="System.Data.SqlClient" connectionString="Data Source=.\;Initial Catalog=ContactDB;Integrated Security=True;MultipleActiveResultSets=True" /> </connectionStrings>
第二步:寫一個查詢,並將其存儲到一個string類型的變量中
String query = "select * from contacts";
第三步:在db實例上啓動查詢,並將泛型返回類型轉換爲聯繫人實體List
(List<Contact>)db.Query<Contact>(query)
只要使用這三個步驟,咱們就能夠從Contacts表中檢索出全部的數據,能夠在須要的地方去填充這些數據。能夠將整個列表打印到Winform程序的GridView或者WPF,更或者將整個列表傳遞給任何外部的WCF.
對於這個示例,咱們將其打印到控制檯
List<Contact> lstContact= (List<Contact>)db.Query<Contact>(query); foreach (var item in lstContact) { Console.WriteLine(item.FirstName + " " + item.LastName+"\n"); } Console.ReadKey();
結果:
示例2:
給Contacts表中插入數據,一樣包含三步
第一步:建立IDbConnection類的對象和SqlConnection的新實例。
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
第二步:
string query = @"Insert into contacts values (@FirstName, @LastName, @Email, @Company, @Title); Select Cast (Scope_Identity() as int)";
在這裏,咱們包含兩個查詢來獲取Contacts表最後插入的id值。
在db實例上啓動查詢,咱們將得到一個int類型的返回值,所以將其存儲到int變量中,並將contact對象和查詢語句傳遞過去,以下所示。
int id = db.Query<int>(query, contact).Single();
在這三個簡單步驟中,數據將被插入到數據庫中。
查看數據庫多了一條記錄,說明插入成功
示例3:如今,讓咱們經過在where子句中傳遞一個id,從Contacts表中獲取一條記錄
第一步:建立IDbConnection類的對象和SqlConnection的新實例。
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
第二步:
string query = "select * from contacts where id = @id";
第三步:在db實例上啓動查詢,咱們將得到一條聯繫人記錄,並將其傳給contact對象進行保存
Contact cont = (Contact)db.Query<Contact>(query, new { id = 7 }).SingleOrDefault();
備註:一樣的方法,咱們能夠對數據庫進行Update和Delete操做
咱們甚至能夠用db.Execute()
db.Query()和db.Execute()之間主要的區別是,用db.Query()咱們能夠按照咱們的設計獲取返回值,由於它是一個通用的方法,而db.Execute()不是一個通用的方法,所以它只能返回int
進一步使用Dapper
示例4:
下面假如說我已經有另外一張名爲「Address」的表
咱們將在兩個表上同時執行CRUD操做,使用相同的ContactId,即Contacts表中的主鍵,Adress表中的外鍵
如今讓咱們經過傳遞Id從Contacts表和Adress表中獲取多條數據
第一步和以前全部示例的第一步相同,咱們從第二步開始
第二步:
string query = "select * from contacts where id = @id ; select * from address where ContactId = @id;";
第三步:db實例上啓動查詢
using (var multipleresult = db.QueryMultiple(query, new { id = 1 })) { var contact = multipleresult.Read<Contact>().SingleOrDefault(); var Addresses = multipleresult.Read<Address>().ToList(); if (contact != null && Addresses != null) { contact.Addresses.AddRange(Addresses); } }
以上三步你將 能夠從多個表中得到多條記錄
示例5:
讓咱們使用存儲過程訪問數據庫
我有一個存儲過程,聲明一個參數(ID),而且基於ID返回Contact數據和Address數據
Use ContactDB SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[sp_GetContact_Address] @Id int AS BEGIN select * from contacts where id = @Id ; select * from Address where ContactId = @Id; END GO
用Dapper調用存儲過程
第一步同其餘示例
在這裏咱們不須要寫任何的query語句,相反的咱們將調用數據庫內的存儲過程
在這裏咱們將作的更改是傳遞一個存儲過程的名稱而不是查詢語句,並傳遞一個名稱爲command type的參數。
第二步:在db實例上啓動查詢
using (var multipleresult = db.QueryMultiple("sp_GetContact_Address", new { id = 1 }, commandType: CommandType.StoredProcedure)) { var contact = multipleresult.Read<Contact>().SingleOrDefault(); var Addresses = multipleresult.Read<Address>().ToList(); if (contact != null && Addresses != null) { contact.Addresses.AddRange(Addresses); } }
僅僅兩步,就 能夠成功的調用數據庫中的存儲過程
示例6:
當咱們須要處理運行時對象時,還能夠將動態對象或者值傳遞給存儲過程
下面這個存儲過程會給Contacts表裏增長一條記錄
use ContactDB SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[SaveContact] @Id int output, @FirstName nvarchar(50), @LastName nvarchar(50), @Email nvarchar(50), @Company nvarchar(50), @Title nvarchar(50) AS BEGIN INSERT INTO [dbo].[Contacts] ([FirstName],[LastName],[Company],[Title],[Email]) VALUES (@FirstName, @LastName, @Company, @Title, @Email); SET @Id = cast(scope_identity() as int) END GO
下面演示瞭如何使用Dapper經過傳遞動態參數調用存儲過程
第一步同其餘示例
第二步:建立一個動態對象並將值傳遞給該對象
var parameter = new DynamicParameters(); parameter.Add("@Id", con.Id, dbType: DbType.Int32, direction: ParameterDirection.InputOutput); parameter.Add("@FirstName", con.FirstName); parameter.Add("@LastName", con.LastName); parameter.Add("@Company", con.Company); parameter.Add("@Title", con.Title); parameter.Add("@Email", con.Email);
第三步:用db.Execute()調用存儲過程
db.Execute("SaveContact",parameter,commandType:CommandType.StoredProcedure); //To get newly created ID back con.Id = parameter.Get<int>("@Id");
這些是使用c#動態對象操做數據庫的方法。
原文連接:https://www.c-sharpcorner.com/UploadFile/e4e3f7/dapper-king-of-micro-orm-C-Sharp-net/?