精致和varchars

Joe*_*Joe 10 varchar dapper

在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 });
Run Code Online (Sandbox Code Playgroud)

在Sql Server上,查询unicode和ansi查询非unicode时使用unicode至关重要

我正在评估Dapper与遗留数据库(SQL Server 2008)一起使用,其中包含许多带varchar参数的存储过程,我对此限制感到有些困惑.

使用手工制作的ADO.NET代码,我将使用以下内容进行上述查询:

new SqlParameter("@Name", "abcde")
Run Code Online (Sandbox Code Playgroud)

没有指定是否是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 = ...;
Run Code Online (Sandbox Code Playgroud)

并且通常让提供者推断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;                     
}
Run Code Online (Sandbox Code Playgroud)

即它明确强制IDataParameter.DbType使用自己的算法查找的值,而不是让提供者使用自己的规则.

有这么好的理由吗?对我来说似乎不对,特别是考虑到Dapper支持varchar参数的评论.

小智 -3

var param = new { Varchar1 = "", Varchar2 = "" };
db.Query("SP", param, commandType:CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)