재우니의 블로그

 

 

string 타입의 파라미터의 NVARCHAR 타입 기본 매핑

 

일반적으로, ADO.NET 및 Entity Framework 등의 .NET 데이터 액세스 기술에서는 string 타입의 파라미터를 SQL Server의 NVARCHAR 타입으로 매핑합니다. 이는 Unicode 문자열을 지원하기 때문입니다. 반면, VARCHAR는 Unicode를 지원하지 않는 ANSI 문자열을 저장합니다. 따라서 VARCHAR 필드에 대해 쿼리를 작성할 때는 DbType.AnsiString을 명시적으로 설정해야 합니다. 이렇게 하면 ADO.NET이 해당 파라미터를 VARCHAR로 처리합니다. 제공해주신 코드는 이러한 원칙에 따라 잘 작성된 것으로 보입니다. eventType 파라미터를 DbType.AnsiString으로 명시적으로 설정하였으므로, 해당 파라미터는 VARCHAR 필드와 호환됩니다.

 

 

 DbType.AnsiString으로 명시적으로 설정

 

condition += " AND Member = @Member";
param.Add("@Member", member, dbType: DbType.AnsiString);

 

 

param 객체가 어떤 타입인지, 그리고 Add 메소드가 어떻게 정의되어 있는지에 따라 세부적인 동작이 달라질 수 있습니다. param 객체가 SqlParameterCollection이거나 Dapper의 DynamicParameters 등의 타입이라면 위 코드는 예상대로 동작할 것입니다.

 

 

숫자형태

 

그럼 숫자형태의 database 의 필드 속성은 어떻게 구현하면 될가요? 아래 예제를 살펴봅니다.

// int 필드
condition += " AND IntegerField = @IntegerField";
param.Add("@IntegerField", integerField, dbType: DbType.Int32);

// bigint 필드
condition += " AND BigIntegerField = @BigIntegerField";
param.Add("@BigIntegerField", bigIntegerField, dbType: DbType.Int64);

// smallint 필드
condition += " AND SmallIntegerField = @SmallIntegerField";
param.Add("@SmallIntegerField", smallIntegerField, dbType: DbType.Int16);

 

 

이렇게 DbType을 명시하면 데이터베이스 엔진이 쿼리를 처리하는 데 필요한 메타데이터를 더 정확하게 알 수 있어, 쿼리 성능이 향상될 수 있습니다.

 

 

datetime, boolean, guid 

 

// DateTime 필드
condition += " AND DateTimeField = @DateTimeField";
param.Add("@DateTimeField", dateTimeField, dbType: DbType.DateTime);

// bit 필드
condition += " AND BitField = @BitField";
param.Add("@BitField", bitField, dbType: DbType.Boolean);

// uniqueidentifier 필드
condition += " AND UniqueIdentifierField = @UniqueIdentifierField";
param.Add("@UniqueIdentifierField", uniqueIdentifierField, dbType: DbType.Guid);

 

 

NVARCHAR(MAX)나 VARCHAR(MAX)

 

NVARCHAR(MAX)나 VARCHAR(MAX)와 같은 데이터 타입의 경우에도 DbType을 명시해주는 것이 좋습니다. 이 경우에는 DbType.String을 사용하면 됩니다. DbType.String은 Unicode를 지원하므로 NVARCHAR(MAX)에 적합합니다. VARCHAR(MAX)를 사용할 경우에는 DbType.AnsiString을 사용하면 됩니다. 다음은 NVARCHAR(MAX)와 VARCHAR(MAX) 필드에 대한 쿼리 예제입니다:

 

// NVARCHAR(MAX) 필드
condition += " AND NVarCharMaxField = @NVarCharMaxField";
param.Add("@NVarCharMaxField", nVarCharMaxField, dbType: DbType.String);

// VARCHAR(MAX) 필드
condition += " AND VarCharMaxField = @VarCharMaxField";
param.Add("@VarCharMaxField", varCharMaxField, dbType: DbType.AnsiString);

 

 

전체 확인하기

 

Dapper의 DynamicParameters를 사용하여 쿼리를 작성하는 경우도 비슷합니다. DynamicParameters 객체를 생성하고, Add 메소드를 사용하여 파라미터를 추가할 수 있습니다. 다음은 int, bigint, smallint, DateTime, bit, uniqueidentifier, NVARCHAR(MAX), VARCHAR(MAX) 필드에 대한 Dapper 쿼리 예제입니다:

 

이제 전체적으로 dapper 를 활용한 DynamicParameters 를 활용하여 기술해 보죠.

 

var param = new DynamicParameters();

// int 필드
param.Add("@IntegerField", integerField, DbType.Int32);

// bigint 필드
param.Add("@BigIntegerField", bigIntegerField, DbType.Int64);

// smallint 필드
param.Add("@SmallIntegerField", smallIntegerField, DbType.Int16);

// DateTime 필드
param.Add("@DateTimeField", dateTimeField, DbType.DateTime);

// bit 필드
param.Add("@BitField", bitField, DbType.Boolean);

// uniqueidentifier 필드
param.Add("@UniqueIdentifierField", uniqueIdentifierField, DbType.Guid);

// NVARCHAR(MAX) 필드
param.Add("@NVarCharMaxField", nVarCharMaxField, DbType.String);

// NVARCHAR(MAX) 필드(DbType.String 생략가능)
param.Add("@NVarCharMaxField", nVarCharMaxField);

// VARCHAR(MAX) 필드
param.Add("@VarCharMaxField", varCharMaxField, DbType.AnsiString);

// 이후, param을 쿼리에 사용
var result = connection.Query<T>("YOUR_SQL_QUERY", param, commandType: CommandType.Text);