SQL 和 Dapper 性能隐式转换

问题描述 投票:0回答:2

我们如何防止 Dapper 中的 SQL 隐式转换?

我们意识到,我们正在进行 SQL 隐式转换,导致索引扫描和死锁。 Dapper 参数是 nvarchar,而 SQL 表列是 varchar。这导致我们所有的 sql 列都转换为 nvarchar。

我们通过检查所有嵌入的 Dapper 代码并将列转换为

cast(@SSN as varchar(9)), cast(@LastName as varcarh(25)), cast(@EmployeeId as varchar(10)

解决了这个问题

一定有更简单的方法,不是吗?

我读了这篇博客,但我们没有像这个例子一样设置字符串:

new { queryPlanHash = args[0], startDate = DateTime.Today.AddDays(-7) });

https://www.codeproject.com/articles/594133/bepluscarefulpluswithplusvarcharsplusinplusdapper

我们可以在连接字符串中更改一些内容吗?

FinanceConnectionString "providerName="System.Data.SqlClient" connectionString="Data Source=(local);Initial Catalog=FinanceData;integrated security=SSPI;persist security info=False; Trusted_Connection=Yes" />
c# sql-server orm deadlock dapper
2个回答
3
投票

您可以配置 Dapper 以始终将字符串提交为 varchar 而不是 nvarchar

Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);

另请参阅AnsiStrings 可以默认与 Dapper 一起使用吗?


0
投票

其他人可能会偶然发现这一点,所以我想添加我的(我认为很重要的)5 美分。

习惯显式定义 Db 数据类型,不要依赖默认映射。因为您有时会想要实际发送 nvarchar 参数,而不是 varchar 参数。

这是一个代码示例,演示了使用 Dapper 是多么容易。

var parameters = new DynamicParameters();
var AccountNumber = "AW00000013";
parameters.Add("@AccountNumber", accountNumber, DbType.AnsiString, ParameterDirection.Input, AccountNumber.Length);
var sql = "select CustomerId, AccountNumber from Sales.Customer where AccountNumber = @AccountNumber";
using (var connection = new SqlConnection(connString))
{
    var customers = connection.QuerySingle<SalesCustomer>(sql, parameters);
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.