1.Dapper框架介紹
Dapper是.NET開發中一款輕量級的ORM映射框架,它輕量級、速度快,與同型別ORM框架如EF框架相比具有更高的執行效率,支持多種資料庫,可以在所有的Ado.NET Providers下作業,包括sqlite、oracle、mysql、postgreSQL與SqlServer資料庫,可以與資料庫進行一對一、一對多、多對多的關系映射,它內部通過Emit反射IDataReder序列佇列,來快速得到和產生物件,性能高,支持.NET Core,是一個跨平臺的框架,
Dapper框架官網:https://dapper-tutorial.net/dapper
2.Dapper框架的基本應用
2.1.Dapper框架的安裝參考
使用Dapper框架首先需要在專案中引入Dapper的安裝包,在專案中添加參考瀏覽外部參考包,選擇Dapper進行下載即可將Dapper框架相關的組件引入到解決方案中,具體操作如下:

2.2.基于mockaroo構造虛擬資料
Mockaroo網址:https://www.mockaroo.com/
Mockaroo是一個模擬虛擬資料的一個資料構造網站,可以通過它來構造虛擬的資料庫表中的資料,并生成sql檔案,非常方便,這里簡單地列出構造資料的表與相應的表中的欄位列,
這里使用mockaroo網站構造資料列并下載到對應的sql如下圖所示操作即可:

選擇Download Data后可以自動生成Person.sql檔案,
2.3.Dapper與資料庫訪問操作
使用Dapper連接Sqlserver資料庫需要使用到連接字串,連接字串是在App.config檔案中配置,需要添加如下連接配置:

配置如下:
<connectionStrings> <add name="ConnString" connectionString="Server=DESKTOP-3POL04N;User Id=sa;Pwd=123456;DataBase=DapperDemo" providerName="System.Data.SqlClient" /> </connectionStrings>
構造連接訪問助手類DBHelper類:
①首先需要在專案中添加DBHelper的型別參考System.Configuration;

②構建DBHelper資料庫訪問類:
//資料訪問助手類 public static class DBHelper { /// <summary> /// 從組態檔中讀取資料庫連接字串 /// </summary> public static string ConnString { get { return ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString; } } }
2.3.1.按條件進行查詢
條件查詢及Sql注入問題的解決:
Sql注入問題主要是使用SqlConnection物件的Query方法進行匿名引數傳遞,需要對應sql陳述句中的變數的值以及使用傳入的引數進行賦值,
/// <summary> /// 根據用戶姓氏查詢用戶集合 /// </summary> /// <param name="lastName"></param> /// <returns></returns> public List<Person> FindListByLastName(string lastName) { //IDbConnection由于Dapper ORM的操作實際上是對IDbConnection類的擴展,所有的方法都是該類的擴展方法, using (IDbConnection db = new SqlConnection(DBHelper.ConnString)) { //C#6的語法:容易引起sql注入的問題,如:select * from Person where last_name = 'Crevy' or '1' = '1'; string sql = $"select * from Person where last_name = '{lastName}'"; //解決sql注入的問題,注意以下的引數對應關系 string sqlQuery = $"select * from Person where last_name = @tempName"; return db.Query<Person>(sqlQuery, new { tempName = lastName }).ToList(); // return db.Query<Person>(sqlQuery).ToList(); //轉化為List的型別回傳 } }
2.3.2.按輸入進行插入
執行插入資料代碼:
/// <summary> /// 根據界面輸入插入對應資料 /// </summary> /// <param name="lastName"></param> /// <returns></returns> public bool InsertPersonData(Person person) { //IDbConnection由于Dapper ORM的操作實際上是對IDbConnection類的擴展,所有的方法都是該類的擴展方法, using (IDbConnection db = new SqlConnection(DBHelper.ConnString)) { string insertSql = "insert into Person(first_name, last_name, email, gender) values " + "(@First_Name, @Last_Name, @Email, @Gender)"; int resNum = db.Execute(insertSql, new Person { First_Name = person.First_Name, Last_Name = person.Last_Name, Email = person.Email, Gender = person.Gender, }); return resNum > 0; } }
資料插入:

執行結果:

2.3.3.修改特定ID的列
修改首先根據界面上輸入的ID進行查詢顯示,之后在執行對應的修改方法,具體代碼如下所示:
/// <summary> /// 根據界面輸入ID查詢出Person資訊 /// </summary> /// <param name="lastName"></param> /// <returns></returns> public Person QueryPersonById(int id) { Person person = null; //IDbConnection由于Dapper ORM的操作實際上是對IDbConnection類的擴展,所有的方法都是該類的擴展方法, using (IDbConnection db = new SqlConnection(DBHelper.ConnString)) { string querySql = "select * from Person where id = @tempId"; person = db.Query<Person>(querySql, new { tempId = id }).FirstOrDefault(); } return person; } /// <summary> /// 根據傳入的Person更新資料庫表中資料 /// </summary> /// <param name="person"></param> public bool UpdatePerson(Person person) { //IDbConnection由于Dapper ORM的操作實際上是對IDbConnection類的擴展,所有的方法都是該類的擴展方法, using (IDbConnection db = new SqlConnection(DBHelper.ConnString)) { string updateSql = "update Person set " + "first_name = @First_Name, last_name = @Last_Name, email = @Email, gender = @Gender " + "where id = @ID"; //注意:這里的First_Name、Last_Name等這些欄位都是person賦值的,所以必須和Person //類中的屬性一致 int exeRes = db.Execute(updateSql, person); return exeRes > 0; } }
界面上的點擊按鈕事件撰寫:
private void searchBtn_Click(object sender, EventArgs e) { PersonService service = new PersonService(); string idStr = this.searchID.Text; if (!int.TryParse(idStr, out int id)) { MessageBox.Show("ID必須為正整數", "警告"); return; } Person person = service.QueryPersonById(id); this.tb_firstName.Text = person.First_Name; this.tb_lastName.Text = person.Last_Name; this.tb_Email.Text = person.Email; this.tb_Gender.Text = person.Gender; } private void update_Btn_Click(object sender, EventArgs e) { PersonService service = new PersonService(); bool updateRes = service.UpdatePerson(new Person { ID = Convert.ToInt32(this.searchID.Text), First_Name = this.tb_firstName.Text, Last_Name = this.tb_lastName.Text, Email = this.tb_Email.Text, Gender = this.tb_Gender.Text }); MessageBox.Show(updateRes ? "資料更新成功" : "資料更新失敗"); }
修改結果:


2.3.4.洗掉特定的資料列
洗掉資料部分比較簡單,下面直接給出洗掉代碼部分:
/// <summary> /// 根據傳入的ID進行資料洗掉 /// </summary> /// <param name="person"></param> public bool DeleteDataById(int id) { //IDbConnection由于Dapper ORM的操作實際上是對IDbConnection類的擴展,所有的方法都是該類的擴展方法, using (IDbConnection db = new SqlConnection(DBHelper.ConnString)) { string delSql = "delete from person where id = @ID"; //類中的屬性一致 int exeRes = db.Execute(delSql, new { ID = id}); return exeRes > 0; } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/125.html
標籤:WinForm
上一篇:ExcelWeb腳本助手,自定義腳本,批量操作Excel與網頁
下一篇:C# WinForm捕獲全域例外
