Dapper操作Sql Server和MySql数据库

Dapper ORM简介与实战
本文介绍了Dapper ORM的优点及应用场景,并提供了详细的使用教程,包括配置数据库连接、实体类定义、增删改查操作等。此外,还讲解了如何防止SQL注入及进行事务操作。

1.为什么选择Dapper

1)轻量。

2)速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。

3)支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server

4)可以映射一对一,一对多,多对多等多种关系。

5)性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。

6)支持FrameWork2.0,3.0,3.5,4.0,4.5

7)Dapper语法十分简单。并且无须迁就数据库的设计

2.使用教程

1)在配置文件web.config中添加连接字符串

1
2
3
4
<connectionStrings>
  <add name="sqlconnectionString" connectionString="server=127.0.0.1;database=MyDataBase;User=sa;password=123456;Connect Timeout=1000000"/>
  <add name="mysqlconnectionString" connectionString="Database=hyd;Data Source=127.0.0.1;User Id=root;Password=root;CharSet=utf8;port=3306"/>
</connectionStrings>

2)获取连接数据库对象

  获取Sql Server的连接数据库对象:SqlConnection  

1
2
3
4
5
6
7
public static SqlConnection SqlConnection()
        {
            string sqlconnectionString = ConfigurationManager.ConnectionStrings["sqlconnectionString"].ToString();
            var connection = new SqlConnection(sqlconnectionString);
            connection.Open();
            return connection;
        }

 获取MySql的连接数据库对象:MySqlConnection  

1
2
3
4
5
6
7
public static MySqlConnection MySqlConnection()
   {
       string mysqlconnectionString = ConfigurationManager.ConnectionStrings["mysqlconnectionString"].ToString();
       var connection = new MySqlConnection(mysqlconnectionString);
       connection.Open();
       return connection;
   }

封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class DapperService
    {
        public static SqlConnection SqlConnection()
        {
            string sqlconnectionString = ConfigurationManager.ConnectionStrings["sqlconnectionString"].ToString();
            var connection = new SqlConnection(sqlconnectionString);
            connection.Open();
            return connection;
        }
        public static MySqlConnection MySqlConnection()
        {
            string mysqlconnectionString = ConfigurationManager.ConnectionStrings["mysqlconnectionString"].ToString();
            var connection = new MySqlConnection(mysqlconnectionString);
            connection.Open();
            return connection;
        }
    }

3)实体类

1
2
3
4
5
6
public class Users
 {
     public int ID { getset; }//自增主键
     public string Name { getset; }
     public int  Age { getset; }
 }

4)增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//增
    using (IDbConnection conn = DapperService.MySqlConnection())
    {
        Users user = new Users();
        user.Name = "CNKI";
        user.Age = 38;
        string sqlCommandText = @"INSERT INTO USERS(Name,Age)VALUES(@Name,@Age)";
        int result = conn.Execute(sqlCommandText, user);
    }
  //批量增
    using (IDbConnection conn = DapperService.MySqlConnection())
    {
        List<Users> list = new List<Users>();
        for (int i = 0; i < 5; i++)
        {
            Users user = new Users();
            user.Name = "CNKI";
            user.Age = 38;
            list.Add(user);
        }
        string sqlCommandText = @"INSERT INTO USERS(Name,Age)VALUES(@Name,@Age)";
        int result = conn.Execute(sqlCommandText, list);
    }
    //删
    using (IDbConnection conn = DapperService.MySqlConnection())
    {
        Users user = new Users();
        user.ID = 1;
        string sqlCommandText = @"DELETE FROM USERS WHERE ID=@ID";
        int result = conn.Execute(sqlCommandText, user);
    }
    //改
    using (IDbConnection conn = DapperService.MySqlConnection())
    {
        Users user = new Users();
        user.ID = 2;
        user.Name = "CNKI";
        user.Age = 18;
        string sqlCommandText = @"UPDATE USERS SET Age=@Age WHERE ID=@ID";
        int result = conn.Execute(sqlCommandText, user);
    }
    //查
    using (IDbConnection conn = DapperService.MySqlConnection())
    {
        string sqlCommandText = @"SELECT * FROM USERS WHERE ID=@ID";
        Users user = conn.Query<Users>(sqlCommandText, new  { ID=2 }).FirstOrDefault();
    }
   //分页
    using (IDbConnection conn = DapperService.MySqlConnection())
    {
        int pageIndex = 0;
        int pageSize = 2;
        string sqlCommandText = string.Format(@"SELECT * FROM USERS  LIMIT {0},{1} ", pageIndex * pageSize, pageSize);
        List<Users> user = conn.Query<Users>(sqlCommandText).ToList();
    }

3.防止Sql注入

1
2
3
4
5
6
7
using (IDbConnection conn = DapperService.MySqlConnection())
 {
     string sqlCommandText = @"SELECT * FROM USER WHERE ID=@ID";
     var p = new DynamicParameters();
     p.Add("@ID", 1);
     User user2 = conn.Query<User>(sqlCommandText,p).FirstOrDefault();
 }

这要用到了Dapper的DynamicParameters动态参数集合类,从上面可以看到可以能过Add方法加入参数。最后通过conn.Query<MSys_Admin>(sqlText, p)执行sql,,返回结果。因为用的是命令参数的形式,让sql注入无机可乘,所以这种方案是安全的。

4.操作事物

复制代码
 1 [TestMethod]
 2  public void TestDapperTransaction()
 3  {
 4      using (var conn = new MySql.Data.MySqlClient.MySqlConnection("server=localhost;User Id=root;password=root;Database=test"))
 5      {
 6          conn.Open();
 7          IDbTransaction trans = conn.BeginTransaction();
 8          int row = conn.Execute(@"update t set name='www.lanhusoft.com' where id=@id", new { id = 3 }, trans);
 9          row += conn.Execute("delete from t where id=@id", new { id = 5 }, trans);
10          for (int i = 0; i < 100; i++)
11          {
12              conn.Execute(@"insert t(id, name) values (@id, @name)", new { id = i, name = "www.lanhusoft.com/" + i });
13          }
14          trans.Commit();
15          conn.Close();
16      }

17 }

参见:

http://www.cnblogs.com/cnki/p/5723426.html

<think>首先,用户的问题是基于系统级指令之前的上下文。用户要求我参考提供的引用内容,并回答关于如何使用Dapper连接SQL Server数据库的问题。用户的具体查询是:"我想获取使用Dapper进行SQL Server数据库连接的方法 请问Dapper连接SQL Server数据库的实现方法"。 系统级指令包括: - 使用中文回答。 - 结构清晰。 - 对于数学表达式,使用$...$或$$...$$格式,但在这个上下文中,涉及的是数据库编程,所以数学表达式可能不相关。我应该避免不必要的数学内容。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 参考用户上一次的问题我的回答,但在这个对话中,没有上一个问题;这是该对话中用户的首次提问。因此,我需要基于提供的引用内容。 提供的引用内容: - [^1]: 简化数据库交互:C#中使用Dapper连接SQL Server的终极指南。提到了Dapper的基本用法高级特性。 - [^2]: 基于Dapper + FastMember实现的SQL Server数据访问工具类,讨论了在大型项目中使用Dapper的扩展。 - [^3]: Dapper连接MySQL的示例,但有连接SQL Server的代码片段(string sql = $"SELECT * FROM Person WHERE LastName=@LastName"; db.Query等)。 - [^4]: .NET Core WebAPI配置Dapper连接SQL Server数据库的示例代码。 - [^5]: 使用Dapper访问SQL Server数据库的安装步骤。 我的回答需要: 1. 结构清晰:逐步解释如何使用Dapper连接SQL Server数据库。 2. 使用中文。 3. 从引用中提取关键信息,并自然地添加引用标识。 4. 生成相关问题。 5. 确保回答真实可靠,基于引用内容。 步骤: - **介绍Dapper**:简要解释Dapper是什么,为什么使用它。 - **安装Dapper**:如何安装Dapper包。 - **数据库连接**:如何建立管理数据库连接。 - **基本操作**:查询示例(如SELECT)。 - **引用代码**:从引用中提取代码片段,并添加引用。 - **生成相关问题**:在末尾添加相关问题。 从引用中提取关键点: - 安装:使用NuGet安装Dapper包(引用[5])。 - 连接:使用SqlConnection对象(引用[3]、[4])。 - 示例代码:引用[3]、[4]提供代码片段。 - 工具类:引用[2]提到DapperHelper,但用户的问题是基本连接方法,所以可能专注于核心方法。 回答结构: 1. **引言**:介绍Dapper其优势。 2. **安装步骤**:如何安装Dapper。 3. **数据库连接**:如何创建管理连接。 4. **基本查询示例**:使用Dapper执行SELECT语句。 5. **完整代码示例**:提供一个完整的简单示例。 6. **注意事项**:简要提到高级特性或最佳实践。 7. **相关问题**:生成几个相关问题。 确保引用标识: - 当引用具体内容时,在段落末尾添加[^n]。 生成相关问题: - 基于主题,如性能优化、错误处理、高级用法等。 最终回答框架: - 段落清晰的解释。 - 代码块使用适当格式(如使用```csharp for C# code)。 - 结尾添加相关问题。 </think>### Dapper连接SQL Server数据库的实现方法 以下是基于引用内容的详细步骤说明,帮助您在C#项目中实现使用Dapper连接SQL Server数据库Dapper是一个轻量级ORM(对象关系映射器),简化数据库操作,提升开发效率代码性能[^1]。整个过程包括安装、连接建立、基本查询操作等关键步骤。我将逐步解释,确保内容真实可靠,基于提供的引用资料。 #### 1. **安装Dapper包** 在Visual Studio项目中,通过NuGet包管理器安装Dapper包。打开“包管理控制台”(Tools → NuGet Package Manager → Package Manager Console),输入命令: ```csharp Install-Package Dapper -Version 1.60.6 ``` 这一步确保您的项目引入了Dapper的核心库。安装后,Dapper会自动处理数据库连接的底层细节,减少手动SQL命令的复杂性[^5]。 #### 2. **建立数据库连接** 使用`SqlConnection`对象创建连接字符串,指向SQL Server数据库连接字符串通常包含服务器地址、数据库名、身份验证信息(如用户名密码)。以下是基本示例代码: ```csharp using System.Data.SqlClient; using Dapper; public class DatabaseService { private readonly string _connectionString = "Server=your_server_address;Database=your_db_name;User Id=your_username;Password=your_password;"; public void ConnectAndQuery() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); // 打开连接 // 数据库操作代码放在此处 } // 使用using语句确保连接自动释放,避免资源泄露[^3] } } ``` **关键点:** - 连接字符串需替换为您的实际SQL Server配置(例如,本地服务器可使用`Server=localhost;Database=TestDB;Integrated Security=True;`)。 - `using`块自动管理连接的打开关闭,确保高效资源回收[^3]。 - 在大型项目中,建议将连接字符串存储在配置文件(如appsettings.json)中,增强安全性[^1]。 #### 3. **执行基本查询操作** Dapper的核心方法是`Query`(用于SELECT查询)`Execute`(用于INSERT/UPDATE/DELETE)。以下是SELECT查询的简化示例,基于引用中的代码: ```csharp public List<Person> GetPersonsByLastName(string lastName) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); string sql = "SELECT * FROM Person WHERE LastName = @LastName"; var result = connection.Query<Person>(sql, new { LastName = lastName }).ToList(); return result; } } ``` **解释:** - `Query<T>`方法将查询结果映射到`Person`类(需提前定义实体类,如`public class Person { public int Id { get; set; } public string LastName { get; set; } }`)。 - 参数化查询(`@LastName`)防止SQL注入攻击,提升安全性[^3]。 - 此方法返回`IEnumerable<T>`,使用`.ToList()`转换为列表,便于处理[^4]。 #### 4. **完整示例:.NET Core WebAPI中的集成** 在ASP.NET Core项目中,您可以创建工具类简化操作(参考引用[2]的DapperHelper思路)。以下是一个完整的控制器示例,测试数据库连接并执行查询: ```csharp using Microsoft.AspNetCore.Mvc; using System.Data.SqlClient; using Dapper; [ApiController] [Route("api/[controller]")] public class TestController : ControllerBase { private readonly string _connectionString = "Server=localhost;Database=TestDB;Integrated Security=True;"; [HttpGet("TestDb")] public ActionResult TestDb() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); string sql = "SELECT TOP(1) * FROM test"; // 示例表名test var result = connection.QueryFirstOrDefault<dynamic>(sql); return Ok(result); // 返回查询结果 } } } ``` **注意事项:** - 此代码展示了在WebAPI中使用Dapper执行简单查询的过程。结果以动态类型(`dynamic`)返回,适合快速测试[^4]。 - 在实际项目中,建议封装连接逻辑到独立服务类中,提升代码重用性(如引用[2]中的DapperHelper工具类)[^2]。 - Dapper支持事务处理、批量操作(如SqlBulkCopy)等高级特性,适用于大型项目优化性能[^1][^2]。 #### 5. **最佳实践常见问题** - **性能优化**:Dapper通过轻量级映射减少开销,比Entity Framework更快;但需避免频繁打开/关闭连接,建议使用连接池。 - **错误处理**:在`using`块内添加try-catch处理异常,如连接失败或SQL错误。 - **扩展工具**:结合FastMember或SqlBulkCopy处理大数据量导入,提升效率(参考引用[2]的亮点)[^2]。 - **安全性**:始终使用参数化查询,防止SQL注入;不要硬编码敏感信息(如密码)。 通过以上步骤,您可以高效地在C#项目中实现DapperSQL Server连接Dapper的核心优势在于简单性高性能,特别适合需要快速开发高吞吐量的场景[^1][^5]。如有具体问题,请提供更多细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值