ANSISTRINGを表すために使用できる.NETフレームワークに組み込みクラスがありますか?

StackOverflow https://stackoverflow.com/questions/6069021

  •  07-09-2020
  •  | 
  •  

質問

Dapperの場合、厳しいパラメータを渡すためのサポートを構築する必要があります。

データベースにはUnicode文字列と非Unicode文字列の両方があり、正しいパラメータタイプを選択することは明確になります。

特定のパラメータのDbType.String vs DbType.AnsiStringは、PERFを大幅に効果的に効果的にします。

Dapperではパラメータを動的に渡します。

Query<User>("select * from Users where Name=@Name", new {Name = "name"});
.

typeof(String)

としてPARAMを渡すことを知っているDbType.Stringがわかっているとする内部マップがあります。

しかし、私は私のユーザーが文字列がAnSistringであるべきであることを示すことができるようにしたいです。属性は匿名クラスではサポートされていませんので、これには異なるタイプが必要です。

明らかに私は1つを発明することができます:

public class AnsiString 
{
    private readonly string str;
    public AnsiString(string str)
    {
        this.str = str;
    }

    public String Value { get { return str; } }
}
.

これは私にクリーンなAPIを与えるでしょう:

Query<User>("select * from Users where Name=@Name", 
   new {Name = new AnsiString("name")});
.

しかしながら、このようなクラスがSystem.DataまたはBCLに存在する場合は、発明を作成するのです。

BCLまたはSystem.Dataのどこかのタイプは、上記のサンプルのサンプルと同様の意味論を持つAnsiStringの容器として使用できますか?

役に立ちましたか?

解決

BCLまたはSystem.Dataにはそのようなクラスはありません、あなたはあなた自身を転がす必要があります。

私たちはカスタムタイプを締めくくっていました。このテストは典型的な使用法を示しています:

public void TestDbString()
{
    var obj = connection.Query("select datalength(@a) as a, datalength(@b) as b, datalength(@c) as c, datalength(@d) as d, datalength(@e) as e, datalength(@f) as f",
        new
        {
            a = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true },
            b = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = false },
            c = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = true },
            d = new DbString { Value = "abcde", IsFixedLength = false, Length = 10, IsAnsi = false },
            e = new DbString { Value = "abcde", IsAnsi = true },
            f = new DbString { Value = "abcde", IsAnsi = false },
        }).First();
    ((int)obj.a).IsEqualTo(10);
    ((int)obj.b).IsEqualTo(20);
    ((int)obj.c).IsEqualTo(5);
    ((int)obj.d).IsEqualTo(10);
    ((int)obj.e).IsEqualTo(5);
    ((int)obj.f).IsEqualTo(10);
}
.

だから;それはサポートしています:

  • ANSI対Unicode
  • 固定VS動的長
  • 動的長さの場合は、VS暗黙(長さが<= 4000の場合は4000;その他の場合は4000)を説明します。それ以外の場合は、クエリプランの数を保持)

型は dapper

他のヒント

string for DbType.Stringchar[]用のDbType.AnsiStringを使用できると思います。

あなたの現在のコードと非常によく似ています:

Query<User>("select * from Users where Name=@Name", new {Name = "name".ToCharArray()});
.

またはAnSistringを使用している場合は、拡張方法.ToAnsiString()を作成できます。

public static AnsiString( this string s ) { return new AnsiString(s); }
Query<User>("select * from Users where Name=@Name", new {Name = "name".ToAnsiString()});
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top