我在Dapper .NET项目主页上找到了以下注释。
Dapper支持varchar参数,如果使用param在varchar列上执行where子句,请确保以这种方式传递它:
Query<Thing>("select * from Thing where Name = @Name", new {Name =
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
在Sql Server上,查询unicode和ansi查询非unicode时使用unicode至关重要
我正在评估Dapper与遗留数据库(SQL Server 2008)一起使用,其中包含许多带varchar参数的存储过程,我对此限制感到有些困惑。
使用手工制作的ADO.NET代码,我将使用以下内容进行上述查询:
new SqlParameter("@Name", "abcde")
没有指定是否是unicode,也没有指定长度。
为什么我需要使用Dapper的详细DbString语法,指定列长度,IsFixedLength和IsAnsi?
为什么varchar列的IsFixedLength = true(我希望它对于char或nchar列是真的)?
我是否必须像这样使用DbString存储过程参数?
我期待Dapper使我的DAL代码更简洁,但这似乎使varchar参数更加冗长。
UPDATE
我已经进行了进一步的研究,试图理解为什么Dapper会有这个varchar限制,我似乎没有在我手工制作的代码中,我通常会创建一个输入参数,如下所示:
var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;
并且通常让提供者使用自己的规则推断DbType
,除非我特别想要强制它。
看看Dapper的DynamicParameters
类,它有一个方法AddParameters
,它创建如下参数:
var dbType = param.DbType; // Get dbType and value
var val = param.Value; // from
...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)
{
p.DbType = dbType.Value;
}
即它明确地将IDataParameter.DbType
转换为使用自己的算法查找的值,而不是让提供者使用自己的规则。
这有充分的理由吗?这对我来说似乎不对,特别是考虑到有关Dapper支持varchar参数的评论。