我接手了一些 C# 代码。
这段代码使用参数连接到数据库,并执行 SQL
查询。
所有的字符串参数类型都被定义为 DbType.AnsiString
,而不是 DbType.String
。
为什么要使用 DbType.AnsiString
而不是 DbType.String
?
AnsiString
一个长度可变的非 Unicode 字符流,长度范围在 1 到 8,000 个字符之间。
String
表示 Unicode 字符串的数据类型。
在数据库中:
nchar 和 nvarchar 是 Unicode 编码。
char 和 varchar 是非 Unicode 编码。
为什么要使用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),这通常与实际列大小定义不匹配,也会引发警告。
看看如何使用Dapper在C#中解决问题:
SqlMapper.AddTypeMap(typeof(string), DbType.AnsiString);
SqlMapper.AddTypeMap(typeof(String), DbType.AnsiString);
DbType.AnsiString
是DbType.String
的子集吗? - Craig Johnston