AnsiString을 나타내는 데 사용할 수 있는 내장 클래스가 .Net 프레임워크에 있습니까?

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

  •  07-09-2020
  •  | 
  •  

문제

Dapper의 경우 AnsiString 매개변수 전달에 대한 지원을 구축해야 합니다.

데이터베이스에는 유니코드 문자열과 유니코드가 아닌 문자열이 모두 있으므로 올바른 매개변수 유형을 선택하는 것이 때로는 중요합니다.

DbType.StringDbType.AnsiString 특정 매개변수의 경우 성능에 큰 영향을 미칠 수 있습니다.

dapper에서는 매개변수를 동적으로 전달합니다. 예:

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

내가 본다면 다음과 같이 표시된 내부 지도가 있습니다. typeof(String) 나는 매개변수를 다음과 같이 전달하는 것을 알고 있습니다. DbType.String

그러나 나는 사용자가 문자열이 AnsiString이어야 함을 표시할 수 있기를 바랍니다.익명 클래스에는 속성이 지원되지 않으므로 이에 대한 고유한 유형이 필요합니다.

분명히 나는 ​​하나를 발명할 수 있습니다:

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 대 유니코드
  • 고정 길이와 동적 길이
  • 동적 길이의 경우 명시적 및 암시적(길이가 <= 4000인 경우 4000,그렇지 않으면 "max" - 쿼리 계획 수를 정상으로 유지합니다.)

유형은 내부에서 사용할 수 있습니다. 날씬한.

다른 팁

사용하시면 될 것 같아요 string ~을 위한 DbType.String 그리고 char[] ~을 위한 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