使用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中 ...
随机推荐
- 深入学习python内存管理
深入Python的内存管理 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 语言的内存管理是语言设计的一个重要方面.它是决定语 ...
- js修改css
转载请注明来源:https://www.cnblogs.com/hookjc/ <style type="text/css"> .style{font-size:9pt ...
- axios取消接口请求
axios取消请求 这里就是分析一下接口请求需要被取消时的一些操作 因为我是用vue写的项目,所以标配用的是axios,怎么在axios中取消已经发送的请求呢? 1.在这之前我们还是先介绍一下原生js ...
- Jquery--1--选择器分类
基本选择器 $("#id") //ID选择器 $("div") //标签选择器 $(".classname ...
- 需求: 使用LinkedList存储一副扑克牌,然后实现洗牌功能。
import java.util.LinkedList; import java.util.Random; /* 需求: 使用LinkedList存储一副扑克牌,然后实现洗牌功能. */ //扑克类 ...
- kubeadm部署安装+dashboard+harbor
kubeadm 部署安装+dashboard+harbor master(2C/4G,cpu核心数要求大于2) 192.168.80.10 docker.kubeadm.kubelet.kubectl ...
- 【译】System.Text.Json 的下一步是什么
.NET 5.0 最近发布了,并带来了许多新特性和性能改进.System.Text.Json 也不例外.我们改进了性能和可靠性,并使熟悉 Newtonsoft.Json 的人更容易采用它.在这篇文章中 ...
- fuzz——AFL基础使用方法
最近打 ctf 的时候感觉有点遇到瓶颈,就来 fuzz 这块看看. AFL 全称为 American huzzy loop,是 Fuzzing 最高级的测试工具之一.这个工具对有源码和无源码的二进制程 ...
- async异步流程控制
http://cnodejs.org/topic/54acfbb5ce87bace2444cbfb 先安装:G:\www\nodejs\one\models>npm install async ...
- 微服务6:通信之网关 Ready
★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 1 概述 回顾下前面几 ...