处理程序将字符串映射到dapper中的varchar

pin*_*ino 5 dapper

我发现这些代码在精致:

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter
{
    ...

    public void AddParameter(IDbCommand command, string name)
    {
        ...
        var param = command.CreateParameter();
        param.ParameterName = name;
        param.Value = (object)Value ?? DBNull.Value;
        if (Length == -1 && Value != null && Value.Length <= 4000)
        {
            param.Size = 4000;
        }
        else
        {
            param.Size = Length;
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么这里的代码需要将长度与4000进行比较吗?

谢谢.

Mar*_*ell 9

查询计划缓存.

以下查询是独立且独立的:

select @foo
Run Code Online (Sandbox Code Playgroud)

select @foo
Run Code Online (Sandbox Code Playgroud)

如果你感到困惑,那是因为我没有显示的位是参数声明 - 在第一个中它是,nvarchar(12)而在第二个中它是nvarchar(20).代码试图避免的是单个查询,执行两次 - 例如一次使用hello(5个字符),一次使用world!(6个字符)执行两个单独的查询计划; 这是不是让双方共享计划,以及场合的数,其中这个选择将效率要低得多负面的东西影响是微乎其微的小.

通过将长度标准化为某个任意值,它允许大多数常见值使用相同的查询计划缓存.这4000是相当随意的(嗯,实际上它被选中是因为它是nvarchar(4000)在开始进入max领域之前的最大尺寸),它也可以是200,或者你想要的任何东西.该代码工作的基础上大多数时间的值是相当短的,所以如果较大的值,他们会是例外,而不是规则.

请注意,只有在未Length明确设置的情况下才会发生所有这些情况; 如果你想要更多地控制它,只需设置.Length你想要的.关键属性是:

  • IsAnsi- 在unicode/not之间切换 - nin[n][var]char(len)
  • IsFixedLength-固定/可变长度之间切换-的var[n][var]char(len)
  • Length- len[n][var]char(len)
  • Value - 实际内容