对应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. 1 public class Person
  2. 2 {
  3. 3 public int Id { get; set; }
  4. 4 public string FirstName { get; set; }
  5. 5 public string LastName { get; set; }
  6. 6 public string EmailAddress { get; set; }
  7. 7 public DateTime CreatedOn { get; set; }
  8. 8 public string IpAddress { get; set; }
  9. 9
  10. 10 //定义一个属性,用来计算所有属性
  11. 11 /// <summary>
  12. 12 /// 计算属性,返回用户的详细信息
  13. 13 /// </summary>
  14. 14 public string Display
  15. 15 {
  16. 16 get
  17. 17 {
  18. 18 return $"{FirstName} {LastName} ({EmailAddress}) {IpAddress}";
  19. 19 }
  20. 20 }
  21. 21 }

二、创建数据库连接帮助类DbHelper.cs

作用:从配置文件中读取数据库连接字符串。

  1. 1 public class DbHelper
  2. 2 {
  3. 3 /// <summary>
  4. 4 /// 从配置文件中读取数据库连接字符串
  5. 5 /// </summary>
  6. 6 public static string ConnectionString
  7. 7 {
  8. 8 get { return ConfigurationManager.ConnectionStrings["Dbconn"].ConnectionString; }
  9. 9 }
  10. 10 }

注:解决ConfigurationManager标红:添加引用Reference→Add Reference→System.Configuration,再在程序中引用using System.Configuration;

三、数据库连接配置(App.config)

作用:在配置文件中存放数据库连接信息,如需修改,只修改配置文件而不用修改源代码,符合开闭原则。

在<configuration>节点下添加<connectionStrings>节点,存放数据库连接信息:

  1. 1 <configuration>
  2. 2 <connectionStrings>
  3. 3 <add name="Dbconn" connectionString="Server=127.0.0.1;Database=master;User Id=sa;Password=Phoenix@2019;" />
  4. 4 </connectionStrings>
  5. 5 </configuration>

四、创建数据库访问类PersonService.cs

作用:连接并访问数据库,读取或写入到数据库。

  1. 1 public class PersonService
  2. 2 {
  3. 3 /// <summary>
  4. 4 /// 根据用户姓氏查询用户集合
  5. 5 /// </summary>
  6. 6 /// <param name="lastName">姓氏</param>
  7. 7 /// <returns></returns>
  8. 8 public List<Person> FindListByLastName(string lastName)
  9. 9 {
  10. 10 //SELECT * FROM Person WHERE LastName='Pye'
  11. 11 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString))
  12. 12 {
  13. 13 //where后直接跟变量来查询,不能避免SQL注入,应使用后边一种写法
  14. 14 //string sql = $"SELECT * FROM Person WHERE LastName='{lastName}'";
  15. 15 //IEnumerable<Person> list = db.Query<Person>(sql);
  16. 16
  17. 17 //Dapper应对SQL注入
  18. 18 //where后边限定属性LastName的必须是@LastName格式,且Query中添加匿名对象new { LastName = lastName},lastName在这里传入
  19. 19 string sql = $"SELECT * FROM Person WHERE LastName=@LastName";
  20. 20 IEnumerable<Person> list = db.Query<Person>(sql, new { LastName = lastName});
  21. 21 return list.ToList();
  22. 22 }
  23. 23 //using语句块结束后自动释放资源,释放数据库连接。
  24. 24 }
  25. 25
  26. 26 /// <summary>
  27. 27 /// 写入一条用户数据
  28. 28 /// </summary>
  29. 29 /// <param name="person">用户信息实体</param>
  30. 30 /// <returns></returns>
  31. 31 public bool Insert(Person person)
  32. 32 {
  33. 33 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString))
  34. 34 {
  35. 35 string sql = "INSERT INTO Person(FirstName, LastName, EmailAddress, CreatedOn) VALUES(@FirstName, @LastName, @EmailAddress, @CreatedOn)";
  36. 36 int result = db.Execute(sql, person);
  37. 37 return result > 0; //简化的转换写法
  38. 38 }
  39. 39 }
  40. 40
  41. 41 /// <summary>
  42. 42 /// 删除一条用户数据
  43. 43 /// </summary>
  44. 44 /// <param name="personId">用户Id</param>
  45. 45 /// <returns></returns>
  46. 46 public bool Delete(int personId)
  47. 47 {
  48. 48 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString))
  49. 49 {
  50. 50 string sql = "DELETE FROM Person WHERE Id = @Id"; //where很重要!!!
  51. 51 int result = db.Execute(sql, new { Id = personId });
  52. 52 return result > 0; //简化的转换写法
  53. 53 }
  54. 54 }
  55. 55
  56. 56 /// <summary>
  57. 57 /// 更新一条用户数据
  58. 58 /// </summary>
  59. 59 /// <param name="person">用户信息实体</param>
  60. 60 /// <returns></returns>
  61. 61 public bool Update(Person person)
  62. 62 {
  63. 63 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString))
  64. 64 {
  65. 65 string sql =
  66. 66 "UPDATE Person SET FirstName = @FirstName, LastName = @LastName, EmailAddress = @EmailAddress WHERE Id = @Id"; //where很重要!!!
  67. 67 int result = db.Execute(sql, person);
  68. 68 return result > 0; //简化的转换写法
  69. 69 }
  70. 70 }
  71. 71
  72. 72 /// <summary>
  73. 73 /// 根据用户Id查询用户
  74. 74 /// </summary>
  75. 75 /// <param name="personId">用户Id</param>
  76. 76 /// <returns></returns>
  77. 77 public Person FindByPersonId(int personId)
  78. 78 {
  79. 79 using (IDbConnection db = new SqlConnection(DbHelper.ConnectionString))
  80. 80 {
  81. 81 string sql = $"SELECT * FROM Person WHERE Id=@Id";
  82. 82 IEnumerable<Person> list = db.Query<Person>(sql, new { Id = personId });
  83. 83 return list.FirstOrDefault();
  84. 84 }
  85. 85 }
  86. 86 }

五、Dashboard界面

作用:分别实现增删改查方法。

后台代码中结合具体数据,调用PersonService中的访问数据库的方法,实现相关业务功能。

  1. 1 private void btnSearch_Click(object sender, EventArgs e)
  2. 2 {
  3. 3 PersonService ps = new PersonService();
  4. 4 List<Person> result = ps.FindListByLastName(txtSearchLastName.Text);
  5. 5 lstSearchResult.DataSource = result;
  6. 6 lstSearchResult.DisplayMember = "Display";
  7. 7 }
  8. 8
  9. 9 private void btnCreate_Click(object sender, EventArgs e)
  10. 10 {
  11. 11 PersonService ps = new PersonService();
  12. 12 Person person = new Person()
  13. 13 {
  14. 14 FirstName = txtFirstName.Text,
  15. 15 LastName = txtLastName.Text,
  16. 16 EmailAddress = txtEmailAddress.Text,
  17. 17 CreatedOn = DateTime.Now
  18. 18 };
  19. 19
  20. 20 var success = ps.Insert(person);
  21. 21 MessageBox.Show(success ? "操作成功" : "操作失败");
  22. 22 }
  23. 23
  24. 24 private void btnDelete_Click(object sender, EventArgs e)
  25. 25 {
  26. 26 PersonService ps = new PersonService();
  27. 27 int personId = Convert.ToInt32(txtIndexPersonId.Text);
  28. 28 var success = ps.Delete(personId);
  29. 29 MessageBox.Show(success ? "操作成功" : "操作失败");
  30. 30 }
  31. 31
  32. 32 private void btnUpdate_Click(object sender, EventArgs e)
  33. 33 {
  34. 34 PersonService ps = new PersonService();
  35. 35 Person person = new Person()
  36. 36 {
  37. 37 Id = Convert.ToInt32(txtIndexPersonId.Text),
  38. 38 FirstName = txtFirstName.Text,
  39. 39 LastName = txtLastName.Text,
  40. 40 EmailAddress = txtEmailAddress.Text,
  41. 41 CreatedOn = DateTime.Now
  42. 42 };
  43. 43
  44. 44 var success = ps.Update(person);
  45. 45 MessageBox.Show(success ? "操作成功" : "操作失败");
  46. 46 }
  47. 47
  48. 48 private void btnIndex_Click(object sender, EventArgs e)
  49. 49 {
  50. 50 PersonService ps = new PersonService();
  51. 51 int personId = Convert.ToInt32(txtIndexPersonId.Text);
  52. 52 var person = ps.FindByPersonId(personId);
  53. 53
  54. 54 txtFirstName.Text = person.FirstName;
  55. 55 txtLastName.Text = person.LastName;
  56. 56 txtEmailAddress.Text = person.EmailAddress;
  57. 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.非零,以在打开连接时使用内置(即提供的框架)解析器解析连接字符串。

七、参考

https://study.163.com/course/courseLearn.htm?courseId=1004855012#/learn/video?lessonId=1050368325&courseId=1004855012

使用Dapper访问SQL Server数据库的更多相关文章

  1. .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库

    今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...

  2. 原生的ado.net(访问sql server数据库)

    本文介绍原生的ado.net(访问sql server数据库) 写在前面 数据库连接字符串 过时的写法 string str = "server=localhost;database=my_ ...

  3. Python3.7.1学习(八) Python访问SQL Server数据库

    一.pip install pymssql即可安装pymssql库 二.Python连接SQL Server数据库     实例代码如下: # -*- coding:utf-8 -*-"&q ...

  4. java 访问sql server数据库

    控制面板--管理工具—ODBC数据源(64位)--系统DNS—添加(名称为“test”,服务器填“.”描述随意) 这里访问的数据库为AdventuerWorks 数据源配置好后可以测试一下,下面是ja ...

  5. 多实例设置本地IP访问sql server 数据库

    我们本地有时候有多个数据库版本(^_^..别说了都是泪),都是为了兼容不同版本的数据而安装的! 最近我们需要用IP来访问,就有了这一段折腾的历程. 上图片为我安装的三个不同的版本,一个为sql ser ...

  6. python 访问sql server数据库

    访问数据库 cnxn = pyodbc.connect("Driver={SQL Server};Server=localhost;Database=用户名;uid=sa;pwd=密码&qu ...

  7. MVC5访问SQL Server数据库

    参考: MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例 1.新建MVC项目: 新建基于MVC5的项目,命名为PracticeProject 2.Models文件夹(右击) ...

  8. 【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误

    问题情形 使用EF Core访问数据库,在本地运行正常,发布到App Service后,偶尔出现了Cannot create a DbSet for ** because this type is n ...

  9. sql server 数据库创建链接服务器访问另外一个sql server 数据库

    继上篇在sql server中创建链接服务器访问oracle数据库:http://www.cnblogs.com/527289276qq/p/4770379.html 本文介绍在sql server中 ...

随机推荐

  1. 深入学习python内存管理

    深入Python的内存管理   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 语言的内存管理是语言设计的一个重要方面.它是决定语 ...

  2. js修改css

    转载请注明来源:https://www.cnblogs.com/hookjc/ <style type="text/css"> .style{font-size:9pt ...

  3. axios取消接口请求

    axios取消请求 这里就是分析一下接口请求需要被取消时的一些操作 因为我是用vue写的项目,所以标配用的是axios,怎么在axios中取消已经发送的请求呢? 1.在这之前我们还是先介绍一下原生js ...

  4. Jquery--1--选择器分类

    基本选择器 $("#id")            //ID选择器 $("div")            //标签选择器 $(".classname ...

  5. 需求: 使用LinkedList存储一副扑克牌,然后实现洗牌功能。

    import java.util.LinkedList; import java.util.Random; /* 需求: 使用LinkedList存储一副扑克牌,然后实现洗牌功能. */ //扑克类 ...

  6. kubeadm部署安装+dashboard+harbor

    kubeadm 部署安装+dashboard+harbor master(2C/4G,cpu核心数要求大于2) 192.168.80.10 docker.kubeadm.kubelet.kubectl ...

  7. 【译】System.Text.Json 的下一步是什么

    .NET 5.0 最近发布了,并带来了许多新特性和性能改进.System.Text.Json 也不例外.我们改进了性能和可靠性,并使熟悉 Newtonsoft.Json 的人更容易采用它.在这篇文章中 ...

  8. fuzz——AFL基础使用方法

    最近打 ctf 的时候感觉有点遇到瓶颈,就来 fuzz 这块看看. AFL 全称为 American huzzy loop,是 Fuzzing 最高级的测试工具之一.这个工具对有源码和无源码的二进制程 ...

  9. async异步流程控制

    http://cnodejs.org/topic/54acfbb5ce87bace2444cbfb 先安装:G:\www\nodejs\one\models>npm install async ...

  10. 微服务6:通信之网关 Ready

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 1 概述 回顾下前面几 ...