【问题标题】:handler mapping of string to varchar in dapperdapper 中字符串到 varchar 的处理程序映射
【发布时间】:2020-09-04 12:00:19
【问题描述】:

我在 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;
        }
        ...
    }
}

为什么把长度比作4000?

【问题讨论】:

    标签: dapper


    【解决方案1】:

    查询计划缓存。

    以下查询是独立的:

    select @foo
    

    select @foo
    

    如果你感到困惑,那是因为我没有显示的是参数声明 - 第一个是nvarchar(12),第二个是nvarchar(20)。代码试图避免的是单个查询,执行两次 - 例如一次使用hello(5 个字符)和一次使用world!(6 个字符),具有两个单独的查询计划;这比允许双方共享计划效率低得多,而且这种选择负面影响事情的次数几乎没有

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

    请注意,所有这些只有在您没有明确设置Length 时才会发生;如果您想对此进行更多控制,只需.Length 设置为您想要的。关键属性是:

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

    【讨论】:

    • 好吧,看来我的理解是完全错误的。但是,根据msdn:...For strings larger than 4000 characters, explicitly set the SqlDbType. 中的说明和您的解释,这里没有t any explicitly set`,为什么它仍然有效?
    • @pinopino dapper always 显式设置类型;在您的示例中,它位于... - 实际行是parameter.DbType = this.IsAnsi ? (this.IsFixedLength ? DbType.AnsiStringFixedLength : DbType.AnsiString) : (this.IsFixedLength ? DbType.StringFixedLength : DbType.String);。我们使用DbType 而不是SqlDbType,因为dapper 不绑定到SQL-Server(它适用于任何ADO.NET 提供程序)——但结果是一样的;传达相同的信息。
    • 抱歉,其实这完全是另一个问题,我发布了here。至于这个,谢谢Marc,你的解释对我帮助很大!
    • 为了清楚起见,IsAnsi 对于 varchar 应该是 true,对于 nvarchar 应该是 false。 IsFixed 对于 [n]char 应该为 true,对于 [n]varchar 应该为 false。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 2013-07-20
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多