• 使用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.10MES est.db"解析为:"C:192.168.1.10MES est.db"

    解决方法:字符串格式问题,应写为@"\192.168.1.10MES est.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

  • 相关阅读:
    关于android.view.WindowLeaked异常的解决方案
    android 使用shape使android组件呈现特殊效果
    (IOS)N duplicate symbols for architecture i386
    (IOS)国际本地化设置
    URL参数中有 特殊符号或加密数据 的问题解决
    S2S:分享出的营销机遇
    (IOS)Apple 证书相关
    (IOS)阻止文件被iTunes和iCloud同步
    (IOS)多线程开发
    时间复杂度
  • 原文地址:https://www.cnblogs.com/zwh1993/p/dapper.html
Copyright © 2020-2023  润新知