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

長さを 4000 と比較するのはなぜですか?

4

1 に答える 1

9

クエリ プラン キャッシュ。

次のクエリは個別で独立しています。

select @foo

select @foo

あなたが混乱している場合、それは私が示していないビットがパラメータ宣言だったからです - 最初のものはそうnvarchar(12)で、2番目のものはそうですnvarchar(20). コードが回避helloしようとしているのは、2 回実行される単一のクエリworld!です。これは、両方が計画を共有することを許可するよりもはるかに効率が悪く、この選択が物事に悪影響を与える機会の数はほとんどありません.

任意の値で長さを標準化することにより、最も一般的な値で同じクエリ プラン キャッシュを使用できるようになります。は4000かなり恣意的なものです (まあ、実際には がテリトリーnvarchar(4000)に入り始める前の最大サイズであるため選択されました) 。コードは、ほとんどの時間値がかなり短いことに基づいて動作しているため、より大きな値がある場合、ルールではなく例外になります。max200

Lengthこれはすべて、明示的に設定していない場合にのみ発生することに注意してください。これをさらに制御したい場合は、単に必要なものに設定.Lengthしてください。主なプロパティは次のとおりです。

  • IsAnsi- Unicode/not の切り替え - nin[n][var]char(len)
  • IsFixedLength- 固定長/可変長の切り替え - varin[n][var]char(len)
  • Length-lenイン[n][var]char(len)
  • Value- 実際の内容
于 2013-07-02T07:08:35.747 に答える