C#:DbType.String 与 DbType.AnsiString

Posted

技术标签:

【中文标题】C#:DbType.String 与 DbType.AnsiString【英文标题】:C#: DbType.String versus DbType.AnsiString 【发布时间】:2021-11-10 08:06:37 【问题描述】:

我已经接管了一些 C# 代码。

代码正在使用一些使用参数的SQL 访问数据库。

所有字符串参数都输入为DbType.AnsiString,而不是DbType.String

为什么要使用DbType.AnsiString 而不是DbType.String

【问题讨论】:

【参考方案1】:

AnsiString 可变长度的非 Unicode 字符流,范围在 1 到 8,000 个字符之间。

字符串 表示 Unicode 字符串的类型。

在数据库中:

nchar 和 nvarchar 是 unicode

char 和 varchar 是非 unicode

【讨论】:

+1。为什么会有人 NOE 使用它的 AnsiString 是数据库中的 ansi 非 unicode 字符串?把我当作逻辑来逃避。 DbType.AnsiStringDbType.String 的子集吗? 短:支持中文、日文、韩文等多国语言 Unicode 可以用不同的编码来表示——有问题的编码是什么?【参考方案2】:

您将使用 ansistring 而不是 string 以避免 SQL Server 数据库中的隐式转换。

即当您将字符串变量传递给 MSSQL 时,它显示为 nvarchar(max)。鉴于 MSSQL 中设计良好的数据库默认情况下可能使用 varchars 而不是 nvarchars(除非有非拉丁字符集的业务需求)。

在这种情况下,字符串变量将导致数据库中的隐式转换。这会导致引擎无法使用某些索引并执行全表扫描(数据库性能万恶之源之一)

【讨论】:

【参考方案3】:

为什么要使用 DbType.AnsiString 而不是 DbType.String?

简答:当您的SqlParameter 指向varchar(或char)数据库列时,您将使用DbType.AnsiString。当您指向nvarchar 列时,请使用DbType.String,因为它的Unicode

更长的答案: 如果这些映射不准确(例如,将DbType.String 指向varchar(nn) 列,您将在查询计划中看到CONVERT_IMPLICIT 警告,如Pinal Dave 所述:https://blog.sqlauthority.com/2018/06/11/sql-server-how-to-fix-convert_implicit-warnings/

就我而言SqlParameter.Size 属性似乎也很重要:要完全消除CONVERT_IMPLICIT 警告,我必须正确映射DbType Size .默认的Size 如果省略则“根据指定参数值的实际大小推断”(1),这通常会与实际列大小定义不匹配,并且也会引发警告。

    https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter.size?view=netframework-4.7.2

【讨论】:

当我为 varchar 列省略 Size 时,我没有收到 CONVERT_IMPLICIT 警告。虽然我没有尝试传递比最大数据库列长度更长的字符串。 Vasily,感谢您的反馈。我做了一点修改,指出尺寸可能是一个因素(在我的情况下),但可能不是在所有情况下。【参考方案4】:

了解如何使用 Dapper 在 C# 中解决问题:

SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString);
SqlMapper.AddTypeMap(typeof(String), DbType.AnsiString);

【讨论】:

以上是关于C#:DbType.String 与 DbType.AnsiString的主要内容,如果未能解决你的问题,请参考以下文章

[转][Dapper]SQL 经验集

我想知道 c# 中 ms access 数据库表列的确切数据类型(dbtype)

C#代码: string a = ConfigurationManager.AppSettings["DBType"].ToString(); app.config里要怎么写,以

Parameters.Add方法和using System.Data.SqlClient; using System.Data.Common;的关系

[Druid-1.2.9_preview_01源码系列]-4-DruidDataSource初始化时的神操作之自动解析DbType与驱动类

如何最好地将 DbType 转换为 System.Type?