더퍼와 varchars

dapper varchar

문제

Dapper .NET 프로젝트 홈 페이지 에서 다음 주석을 발견했습니다.

Dapper는 varchar 매개 변수를 지원합니다. param을 사용하여 varchar 열에서 where 절을 실행하는 경우이 방법으로 전달해야합니다.

    Query<Thing>("select * from Thing where Name = @Name", new {Name = 
    new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

SQL Server에서 유니 코드를 쿼리 할 때 유니 코드를 사용하는 것이 중요합니다. 유니 코드를 쿼리 할 때는 유니 코드와 ansi를 쿼리 할 때 중요합니다.

Dapper를 varchar 매개 변수가있는 저장 프로 시저가 많이 포함 된 레거시 데이터베이스 (SQL Server 2008)와 함께 사용하도록 평가하고 있는데이 제한으로 인해 다소 혼란스러워합니다.

수작업으로 작성된 ADO.NET 코드를 사용하면 다음 쿼리를 사용할 수 있습니다.

new SqlParameter("@Name", "abcde")

유니 코드 여부와 길이를 지정하지 않아도됩니다.

  • Dapper에서이 장황한 DbString 구문이 필요하고 열 길이, IsFixedLength 및 IsAnsi를 지정해야하는 이유는 무엇입니까?

  • 왜 IsFixedLength = varchar 열에 대한 사실 (나는 char 또는 nchar 열에 대한 사실을 기대하고 싶습니다)?

  • 저장 프로 시저 매개 변수에 이와 같은 DbString을 사용해야합니까?

Dapper가 내 DAL 코드를 더 간결하게 만들 것을 기대했지만이 방법은 varchar 매개 변수에 대해 더 자세한 정보를 제공하는 것으로 보입니다.

최신 정보

Dapper가 왜이 varchar 제한을 가지는지 이해하려고 시도하기 위해 조금 더 조사했습니다.이 코드는 수작업으로 작성된 코드에서 보이지 않습니다. 일반적으로 다음과 같이 입력 매개 변수를 만듭니다.

var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;

특히 그것을 강요하고 싶지 않으면 공급자는 자체 규칙을 사용하여 DbType 을 추론해야합니다.

Dapper의 DynamicParameters 클래스를 살펴보면 다음과 같은 매개 변수를 만드는 AddParameters 메서드가 있습니다.

var dbType = param.DbType; // Get dbType and value
var val = param.Value;     // from 

...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)                     
{                         
    p.DbType = dbType.Value;                     
}

즉, IDataParameter.DbType 을 공급자가 자체 규칙을 사용하지 않고 자체 알고리즘으로 조회하는 값으로 명시 적으로 강제합니다.

이것에 대한 좋은 이유가 있습니까? Dapper가 varchar 매개 변수를 지원한다는 의견에 비추어 볼 때 나에게 잘못된 것처럼 보입니다.

인기 답변

ODBC로 작업 할 때이 구문이 필요합니다.

Dapper에 대해 C #에서 DbString으로 CHAR (30) 필드를 정의하고 Dapper가 문자열이 text / blob 유형이라고 가정하지 못하도록 length (30) 및 ansi (true) 값을 설정해야합니다. 그렇지 않으면 "텍스트 / 바이트 BLOB 유형을 변환하려고 잘못되었습니다."라는 오류 메시지가 나타납니다.

DbString ()으로 매개 변수를 정의하고 길이와 ANSI 값을 설정할 때까지 Informix에 연결하기 위해 ODBC를 사용하여이 오류가 발생했습니다.

더 많은 정보는 여기에 있습니다 .



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow