使用Dapper访问SQL Server数据库
对应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.非零,以在打开连接时使用内置(即提供的框架)解析器解析连接字符串。
七、参考
使用Dapper访问SQL Server数据库的更多相关文章
- .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...
- 原生的ado.net(访问sql server数据库)
本文介绍原生的ado.net(访问sql server数据库) 写在前面 数据库连接字符串 过时的写法 string str = "server=localhost;database=my_ ...
- Python3.7.1学习(八) Python访问SQL Server数据库
一.pip install pymssql即可安装pymssql库 二.Python连接SQL Server数据库 实例代码如下: # -*- coding:utf-8 -*-"&q ...
- java 访问sql server数据库
控制面板--管理工具—ODBC数据源(64位)--系统DNS—添加(名称为“test”,服务器填“.”描述随意) 这里访问的数据库为AdventuerWorks 数据源配置好后可以测试一下,下面是ja ...
- 多实例设置本地IP访问sql server 数据库
我们本地有时候有多个数据库版本(^_^..别说了都是泪),都是为了兼容不同版本的数据而安装的! 最近我们需要用IP来访问,就有了这一段折腾的历程. 上图片为我安装的三个不同的版本,一个为sql ser ...
- python 访问sql server数据库
访问数据库 cnxn = pyodbc.connect("Driver={SQL Server};Server=localhost;Database=用户名;uid=sa;pwd=密码&qu ...
- MVC5访问SQL Server数据库
参考: MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例 1.新建MVC项目: 新建基于MVC5的项目,命名为PracticeProject 2.Models文件夹(右击) ...
- 【应用服务 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 ...
- sql server 数据库创建链接服务器访问另外一个sql server 数据库
继上篇在sql server中创建链接服务器访问oracle数据库:http://www.cnblogs.com/527289276qq/p/4770379.html 本文介绍在sql server中 ...
随机推荐
- Web3对于我们普通人意味着什么?
▲ 点击101链视界,关注不走丢 大家好,我是阿创,这是我的第27篇原创文章. 上一篇文章中我们了解了互联网的前世今生:Web 1.0.2.0.3.0,我们对Web的前两个阶段都不陌生,特别是 Web ...
- linux下格式化json文件数据
一.使用 python -m json.tool cat test.json | python -m json.tool 二.jq格式化 在web 2.0时代json这种直观.灵活.高效数据格式基本已 ...
- 有关OPenCV的几个库函数的使用
转载请注明来源:https://www.cnblogs.com/hookjc/ 1) IplImage* cvCreateImage( CvSize size, int depth, int chan ...
- Docker consul的容器服务更新与发现
Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...
- Springboot+Redisson自定义注解一次解决重复提交问题(含源码)
前言 项目中经常会出现重复提交的问题,而接口幂等性也一直以来是做任何项目都要关注的疑难点,网上可以查到非常多的方案,我归纳了几点如下: 1).数据库层面,对责任字段设置唯一索引,这是最直接有效 ...
- JavaGuide--Java篇
本文避免重复造轮子,也是从JavaGuider中提取出来方便日后查阅的手册 参考链接: JavaGuider:https://javaguide.cn/java/basis/java-basic-qu ...
- 用Java中的File类模拟实现对系统文件的增删改查效果
码字不易,三连支持一波吧 IO操作向来是各大语言的热区,而对文件的操作也是重中之重. 那么在Java中也给我们提供了很多关于文件操作的类.今天我就用一个比较基本的File类来模拟实现对文件的增删改查效 ...
- 初探Matrix Android ApkChecker
背景 因为我所在的项目是做投放包,对安卓包的大小很敏感,经常会优化包的大小,所以想引入工具静态检测包大小,看能不能找到其中可以优化的地方,防患于未然.Matrix是微信终端自研和正在使用的一套APM( ...
- HTTP缓存小结
介绍 提到页面优化,浏览器缓存必定是一个绕不过的话题,判断一个网站的性能最直观的就是看网页打开的速度,而提高网页反应速度的一个方式就是使用缓存.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟, ...
- 协程 & IO模型 & HTTP协议
今日内容 进程池与线程池的基本使用 协程理论与实操 IO模型 前端简介 内容详细 一.进程池与线程池的基本使用 1.进程池与线程池的作用 为了保证计算机硬件安全的前提下,提升程序的运行效率 2.回调机 ...