我发现这些代码在精致:
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进行比较吗?
谢谢.
查询计划缓存.
以下查询是独立且独立的:
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 - 实际内容| 归档时间: |
|
| 查看次数: |
2194 次 |
| 最近记录: |