AnsiString을 나타내는 데 사용할 수 있는 내장 클래스가 .Net 프레임워크에 있습니까?
-
07-09-2020 - |
문제
Dapper의 경우 AnsiString 매개변수 전달에 대한 지원을 구축해야 합니다.
데이터베이스에는 유니코드 문자열과 유니코드가 아닌 문자열이 모두 있으므로 올바른 매개변수 유형을 선택하는 것이 때로는 중요합니다.
DbType.String
대 DbType.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()});