dapper mysql 拓展_【C#】Dapper使用Mysql实例,Dapper使用Mysql简单范例,DapperHelper

本文展示了如何在C#中使用Dapper库与MySQL数据库进行交互。通过DapperHelper类,提供了连接数据库、执行插入/更新脚本及查询脚本的方法。示例包括查询和更新操作,便于快速理解和应用。

using MySql.Data.MySqlClient; //自行网上下载引用MySql.Data.dll

using System.Configuration;

using System.Data;

using Dapper;                //自行网上下载引用Dapper.dll

using System.Collections.Generic;

namespace DapperTest

{

public class DapperHelper

{

//Web.config配置链接:

///

/// 连接MySQL数据库

///

///

public static MySqlConnection MySqlCon()

{

string mysqlConnectionStr = ConfigurationManager.ConnectionStrings["testDB"].ToString();

var connection = new MySqlConnection(mysqlConnectionStr);

connection.Open();

return connection;

}

///

/// 执行insert与update脚本

///

public int ExcuteSqlString(string sqlStr)

{

using (IDbConnection conn = DapperHelper.MySqlCon())

{

return conn.Execute(sqlStr);

}

}

///

/// 执行查询脚本

///

public List QuerySqlString(string sqlStr)

{

using (IDbConnection conn = DapperHelper.MySqlCon())

{

return conn.Query(sqlStr) as List;

}

}

//调用测试

public void Test()

{

DapperHelper dh = new DapperHelper();

//查询测试

List list = dh.QuerySqlString("select * from TestTable limit 10;");

//执行测试

int result = dh.ExcuteSqlString("update TestTable set name='test' where id=1");

return;

}

}

}

<think>我们之前已经回答了Dapper如何使用参数传参的问题,并提供了两种方法(DynamicParameters和匿名对象)以及多条件查询的示例。 现在,根据用户的问题,我们注意到用户提供的代码中,当CustomerName不为空时,会添加一个带参数的WHERE子句,但是传递的参数对象是空的(new {})。这会导致在条件满足时,SQL语句中需要参数,但实际没有传递参数,从而引发错误。 因此,我们需要根据条件动态构建参数对象。下面给出两种解决方案的代码和解释。 解决方案1:使用DynamicParameters(推荐) 解决方案2:使用匿名对象 此外,我们还需要注意SQL注入的问题,所以使用参数化查询是必要的。 下面给出详细代码和解释。</think>### Dapper 参数化查询实现详解 在 Dapper 中正确使用参数化查询是防止 SQL 注入的关键,以下是完整解决方案: #### 修复后的代码实现: ```csharp // 初始 SQL 语句 var sql = "SELECT * FROM customer "; // 动态构建参数对象 DynamicParameters parameters = new DynamicParameters(); // 根据条件动态添加 WHERE 子句和参数 if (!string.IsNullOrEmpty(request.CustomerName)) { sql += "WHERE CustomerName = @CustomerName "; parameters.Add("CustomerName", request.CustomerName, DbType.String); } // 执行查询(使用参数化对象) var res = await _dapperHelper.QueryAsync<Customer>(sql, parameters); ``` #### 替代方案:使用匿名对象 ```csharp var sql = "SELECT * FROM customer "; object parameters = null; // 初始化为 null if (!string.IsNullOrEmpty(request.CustomerName)) { sql += "WHERE CustomerName = @CustomerName "; parameters = new { CustomerName = request.CustomerName }; } // 安全执行查询(Dapper 会处理 null 参数) var res = await _dapperHelper.QueryAsync<Customer>(sql, parameters); ``` ### 关键问题解析: 1. **原代码问题**: - 当 `CustomerName` 有值时,SQL 包含 `@CustomerName` 参数占位符 - 但传递的是空对象 `new {}`,导致 Dapper 找不到对应参数 - 结果:抛出 "Parameter '@CustomerName' not found" 异常 2. **参数化原理**: ```mermaid graph LR A[用户输入] --> B[Dapper参数对象] B --> C[创建参数化SQL] C --> D[数据库引擎] D --> E[安全执行] ``` 3. **最佳实践**: - **使用 `DynamicParameters`**: ```csharp var parameters = new DynamicParameters(); parameters.Add("ParamName", value, dbType, direction, size); ``` - **指定数据类型**(提高性能): ```csharp parameters.Add("CustomerName", request.CustomerName, DbType.String); ``` - **多条件处理**: ```csharp if (!string.IsNullOrEmpty(request.Phone)) { sql += "AND Phone = @Phone "; parameters.Add("Phone", request.Phone); } ``` 4. **空值安全处理**: ```csharp // 使用 WHERE 1=1 简化条件拼接 var sql = "SELECT * FROM customer WHERE 1=1 "; if (!string.IsNullOrEmpty(request.CustomerName)) { sql += "AND CustomerName = @CustomerName "; parameters.Add("CustomerName", request.CustomerName); } ``` ### 高级用法:IN 查询参数化 ```csharp var ids = new[] { 101, 205, 307 }; var sql = "SELECT * FROM orders WHERE CustomerId IN @Ids"; // Dapper 自动展开数组为参数化查询 var orders = connection.Query<Order>(sql, new { Ids = ids }); // 实际执行的 SQL(安全): // SELECT * FROM orders WHERE CustomerId IN (@p0, @p1, @p2) // 参数: @p0=101, @p1=205, @p2=307 ``` ### 为什么必须参数化? 1. **SQL 注入示例**: ```csharp // 危险!永远不要这样写! sql += $"WHERE CustomerName = '{request.CustomerName}'"; // 如果用户输入: ' OR 1=1 -- // 最终 SQL: SELECT * FROM customer WHERE CustomerName = '' OR 1=1 --' // 结果: 返回所有客户数据! ``` 2. **参数化优势**: - 自动处理特殊字符转义 - 类型安全验证 - 查询计划复用(提高性能)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值