ダッパー内の文字列のvarcharへのハンドラーマッピング

dapper

質問

私はこれらのコードを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と比較する必要があるのか​​教えていただけますか?

ありがとうございました。

受け入れられた回答

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

次のクエリは独立して独立しています:

select @foo

そして

select @foo

あなたが混乱しているのは、私見せなかったビットがパラメータ宣言であったからです。最初のものはnvarchar(12)で、もう1つはnvarchar(20)です。コードが避けようとしているのは、2回実行される単一のクエリです。たとえば、 hello (5文字)で1回、 world!で1回world! (6文字)があり、2つの別々のクエリプランがあります。それははるかに少ない効率的なの両方が計画を共有することを可能にするよりも、この選択がのものに影響を与える機会の数が無視できるほど小さいです。

長さを任意の値で標準化することで、ほとんどの一般的な値で同じクエリプランキャッシュを使用できます。 4000 (のでよく、実際にそれが選ばれたかなり任意であるnvarchar(4000) 、それが入る開始する前に、最大サイズでmax 、そしてそれだけで同様だったかもしれない領土) 200 、または何でもしたいです。コードは、 時間値のほとんどは 、かなり短い的に取り組んでいるので、より大きな値がある場合、彼らはむしろ例外となります。

これは、 Length明示的に設定していない場合にのみ発生します。これ以上の制御が必要な場合は、 .Lengthを必要なものに設定するだけです 。主なプロパティは次のとおりです。

  • IsAnsi - [n][var]char(len)nがUnicode /
  • IsFixedLength - 固定長/可変長の切り替え - var [n][var]char(len)
  • Length - len [n][var]char(len)
  • Value - 実際の内容


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow