對應Demo程序名:DapperDemo
准備工作:為項目安裝Dapper類庫
方法一:項目中添加:項目名右鍵;Manage NuGet Packages;搜索Dappe;點擊安裝
方法二:在NuGet官網(https://www.nuget.org/)查詢類庫的安裝命令:
搜索Dapper;找到安裝命令(Install-Package Dapper -Version 1.60.6);在Visual Studio中打開包管理工具控制台(Tools→NuGget Package Manager→Packages Manager Console);
選中默認的項目(DapperDemo)並輸入安裝命令;回車
一、創建實體類,例如Person.cs
作用:Person類對應數據庫中的Person表,各字段對應數據庫表的各列。
1 public class Person 2 { 3 public int Id { get; set; } 4 public string FirstName { get; set; } 5 public string LastName { get; set; } 6 public string EmailAddress { get; set; } 7 public DateTime CreatedOn { get; set; } 8 public string IpAddress { get; set; } 9 10 //定義一個屬性,用來計算所有屬性 11 /// <summary> 12 /// 計算屬性,返回用戶的詳細信息 13 /// </summary> 14 public string Display 15 { 16 get 17 { 18 return $"{FirstName} {LastName} ({EmailAddress}) {IpAddress}"; 19 } 20 } 21 }
二、創建數據庫連接幫助類DbHelper.cs
作用:從配置文件中讀取數據庫連接字符串。
1 public class DbHelper 2 { 3 /// <summary> 4 /// 從配置文件中讀取數據庫連接字符串 5 /// </summary> 6 public static string ConnectionString 7 { 8 get { return ConfigurationManager.ConnectionStrings["Dbconn"].ConnectionString; } 9 } 10 }
注:解決ConfigurationManager標紅:添加引用Reference→Add Reference→System.Configuration,再在程序中引用using System.Configuration;
三、數據庫連接配置(App.config)
作用:在配置文件中存放數據庫連接信息,如需修改,只修改配置文件而不用修改源代碼,符合開閉原則。
在<configuration>節點下添加<connectionStrings>節點,存放數據庫連接信息:
1 <configuration> 2 <connectionStrings> 3 <add name="Dbconn" connectionString="Server=127.0.0.1;Database=master;User Id=sa;Password=Phoenix@2019;" /> 4 </connectionStrings> 5 </configuration>
四、創建數據庫訪問類PersonService.cs
作用:連接並訪問數據庫,讀取或寫入到數據庫。
1 public class PersonService 2 { 3 /// <summary> 4 /// 根據用戶姓氏查詢用戶集合 5 /// </summary> 6 /// <param name="lastName">姓氏</param> 7 /// <returns></returns> 8 public List<Person> FindListByLastName(string lastName) 9 { 10 //SELECT * FROM Person WHERE LastName='Pye' 11 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString)) 12 { 13 //where后直接跟變量來查詢,不能避免SQL注入,應使用后邊一種寫法 14 //string sql = $"SELECT * FROM Person WHERE LastName='{lastName}'"; 15 //IEnumerable<Person> list = db.Query<Person>(sql); 16 17 //Dapper應對SQL注入 18 //where后邊限定屬性LastName的必須是@LastName格式,且Query中添加匿名對象new { LastName = lastName},lastName在這里傳入 19 string sql = $"SELECT * FROM Person WHERE LastName=@LastName"; 20 IEnumerable<Person> list = db.Query<Person>(sql, new { LastName = lastName}); 21 return list.ToList(); 22 } 23 //using語句塊結束后自動釋放資源,釋放數據庫連接。 24 } 25 26 /// <summary> 27 /// 寫入一條用戶數據 28 /// </summary> 29 /// <param name="person">用戶信息實體</param> 30 /// <returns></returns> 31 public bool Insert(Person person) 32 { 33 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString)) 34 { 35 string sql = "INSERT INTO Person(FirstName, LastName, EmailAddress, CreatedOn) VALUES(@FirstName, @LastName, @EmailAddress, @CreatedOn)"; 36 int result = db.Execute(sql, person); 37 return result > 0; //簡化的轉換寫法 38 } 39 } 40 41 /// <summary> 42 /// 刪除一條用戶數據 43 /// </summary> 44 /// <param name="personId">用戶Id</param> 45 /// <returns></returns> 46 public bool Delete(int personId) 47 { 48 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString)) 49 { 50 string sql = "DELETE FROM Person WHERE Id = @Id"; //where很重要!!! 51 int result = db.Execute(sql, new { Id = personId }); 52 return result > 0; //簡化的轉換寫法 53 } 54 } 55 56 /// <summary> 57 /// 更新一條用戶數據 58 /// </summary> 59 /// <param name="person">用戶信息實體</param> 60 /// <returns></returns> 61 public bool Update(Person person) 62 { 63 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString)) 64 { 65 string sql = 66 "UPDATE Person SET FirstName = @FirstName, LastName = @LastName, EmailAddress = @EmailAddress WHERE Id = @Id"; //where很重要!!! 67 int result = db.Execute(sql, person); 68 return result > 0; //簡化的轉換寫法 69 } 70 } 71 72 /// <summary> 73 /// 根據用戶Id查詢用戶 74 /// </summary> 75 /// <param name="personId">用戶Id</param> 76 /// <returns></returns> 77 public Person FindByPersonId(int personId) 78 { 79 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString)) 80 { 81 string sql = $"SELECT * FROM Person WHERE Id=@Id"; 82 IEnumerable<Person> list = db.Query<Person>(sql, new { Id = personId }); 83 return list.FirstOrDefault(); 84 } 85 } 86 }
五、Dashboard界面
作用:分別實現增刪改查方法。
后台代碼中結合具體數據,調用PersonService中的訪問數據庫的方法,實現相關業務功能。
1 private void btnSearch_Click(object sender, EventArgs e) 2 { 3 PersonService ps = new PersonService(); 4 List<Person> result = ps.FindListByLastName(txtSearchLastName.Text); 5 lstSearchResult.DataSource = result; 6 lstSearchResult.DisplayMember = "Display"; 7 } 8 9 private void btnCreate_Click(object sender, EventArgs e) 10 { 11 PersonService ps = new PersonService(); 12 Person person = new Person() 13 { 14 FirstName = txtFirstName.Text, 15 LastName = txtLastName.Text, 16 EmailAddress = txtEmailAddress.Text, 17 CreatedOn = DateTime.Now 18 }; 19 20 var success = ps.Insert(person); 21 MessageBox.Show(success ? "操作成功" : "操作失敗"); 22 } 23 24 private void btnDelete_Click(object sender, EventArgs e) 25 { 26 PersonService ps = new PersonService(); 27 int personId = Convert.ToInt32(txtIndexPersonId.Text); 28 var success = ps.Delete(personId); 29 MessageBox.Show(success ? "操作成功" : "操作失敗"); 30 } 31 32 private void btnUpdate_Click(object sender, EventArgs e) 33 { 34 PersonService ps = new PersonService(); 35 Person person = new Person() 36 { 37 Id = Convert.ToInt32(txtIndexPersonId.Text), 38 FirstName = txtFirstName.Text, 39 LastName = txtLastName.Text, 40 EmailAddress = txtEmailAddress.Text, 41 CreatedOn = DateTime.Now 42 }; 43 44 var success = ps.Update(person); 45 MessageBox.Show(success ? "操作成功" : "操作失敗"); 46 } 47 48 private void btnIndex_Click(object sender, EventArgs e) 49 { 50 PersonService ps = new PersonService(); 51 int personId = Convert.ToInt32(txtIndexPersonId.Text); 52 var person = ps.FindByPersonId(personId); 53 54 txtFirstName.Text = person.FirstName; 55 txtLastName.Text = person.LastName; 56 txtEmailAddress.Text = person.EmailAddress; 57 }
前台界面如圖:
六、拓展TODO
可以不使用SQL語句,但要使用Dapper的擴展工具。
使用Dapper連接MySQL數據庫
要另外使用MySql.Data庫
數據庫連接字符串格式為
使用Dapper連接SQLite數據庫
要另外使用System.Data.SQLite庫
對應的DEMO程序名:
通過IP地址連接遠程共享文件夾中的SQLite數據庫時,調試遇到的兩個問題:
1.遠程IP地址解析為C盤的地址,例如"\\192.168.1.10\MES\test.db"解析為:"C:\192.168.1.10\MES\test.db"
解決方法:字符串格式問題,應寫為@"\\192.168.1.10\MES\test.db"
2.能夠訪問到遠程共享文件夾后,可以新建數據庫,但_dbConnection.Open();打開數據庫時報錯:unable to open database file
解決方法:首先嘗試將遠程文件夾的權限設為EveryOne擁有全部權限,未能解決;
然后嘗試_dbConnection = new SQLiteConnection($"Data Source={dbFilePath};Version=3;", true); 設置parseViaFramework參數為true,問題解決。
parseViaFramework:Non-zero to parse the connection string using the built-in (i.e. framework provided) parser when opening the connection.非零,以在打開連接時使用內置(即提供的框架)解析器解析連接字符串。
七、參考