2011-09-07 9 views
1

I 아래와 같이 열거 있습니다열거 형을 바이트 배열로 변환하는 방법?

[Flags] 
public enum AggregationLevel 
{ 
    /// <summary> 
    /// 00000001 
    /// </summary> 
    Department = 1, 

    /// <summary> 
    /// 00000010 
    /// </summary> 
    Gbu = 2, 

    /// <summary> 
    /// 00000100 
    /// </summary> 
    Division = 4, 

    /// <summary> 
    /// 00001000 
    /// </summary> 
    Region = 8, 

    /// <summary> 
    /// 00010000 
    /// </summary> 
    Market = 16, 

    /// <summary> 
    /// 00100000 
    /// </summary> 
    Cluster = 32, 

    /// <summary> 
    /// 01000000 
    /// </summary> 
    Store = 64 
} 

그때는 VARBINARY (바이트 배열)을 필요로하는 프로 시저 파라미터를 갖는다. 이어서

AggregationLevel thisLevel = AggregationLevel.Department & AggregationLevel.Division; 

값이 저장된 순서로 전달되어야한다 :

난에 전달되어야 열거 인스턴스가

var parameter = new SqlParameter("@pBitMask", SqlDbType.VarBinary) 

파라미터 =?

'thisLevel'열거 형을이 sql 매개 변수에 할당 할 수 있도록 바이트 배열로 변환하는 방법은 무엇입니까?

감사합니다,

+1

'AggregationLevel thisLevel = AggregationLevel.Department | Department와 Division을 원한다면 (AggregationLevel.Division;'&'대신'| '를 적어 두십시오). –

+0

SQL 매개 변수에 Int를 전달할 수 있습니까? 아니면 바이트 배열이어야합니까? – Kolja

+0

오해의 소지가 있습니다. 각 요소가'AggregationLevel'에서 약간의 값을 가진 배열을 가질 필요가 있을까요? 즉, 당신은 그 추론 대신에 7 가지 항목의 배열이 필요할 것입니다. 그러나, DB에 열거 형의 int 값을 저장하는 것이 좋습니다. – Abel

답변

3

몇 가지 ..

1) 당신은보다는 사용하거나 필요 AND : 당신이하지 않아도

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division; 

2) 당신은이 순서를 사용할 수 있습니다 소수점 2의 힘을 기억 :

0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100 ... 

3) 마지막으로, varbinary 당신이 원하는 것을하지 않습니다. integer 또는 bigint을보십시오. 열거 형은 int 또는 long으로 저장되며 int 또는 long의 비트 수로 제한됩니다. varbinary에 저장하려면 값을 바이트 문자열로 serialize해야합니다. 빅 엔디안을 원할지, 얼마나 많은 바이트를 저장해야하는지에 따라 달라지며 가변적 일 수도 있습니다. 더 많은 정보가 필요합니다. # 3

두 가지 옵션 :

그것은 당신의 통제하에 당신/코드의 경우

A. (필요한 비트 수에 따라) VARBINARY, 사용 INT 또는 BIGINT를 사용하지 마십시오. 더 나은 여전히 ​​(잠재적으로) 당신이 아니라면 그들에

B.를 조회 할 거라면, 사용 비트 필드 대신의 DBA 또는 앱 공급자가 그들의 VARBINARY이

을 채울 방법을 지정할 수 있습니다 희망이 도움이됩니다.

+0

. 저장 프로 시저에서 예를 들어 싶습니다. 그래서 varbinary가 필요하지만, C#에서 정수를 전달하는 것이 실현 될 것입니다. 그래서 –

+0

'i & 2'는'varbinary'에 국한되지 않습니다. SQL의 비트 연산은 문제가되지 않으며 정수형을 사용하는 것이 더 좋습니다. http://msdn.microsoft.com/en-us/library/ms176122.aspx –

+0

당신은 옳은 것 같습니다; 감사. –

0

"바이트 배열"로 저장할 필요가 없으므로 결합 된 값은 단일 정수에 편안하게 맞습니다.

+0

varbinary가되는 이유는 다음과 같습니다. http://consultingblogs.emc.com/jamesrowlandjones/archive/2008/07/04/using-a-bitmask-a-practical-example.aspx –

+0

In SqlServer , 동일한 구문을 사용하여 일반 정수를 비트 마스크 처리 할 수도 있습니다. –

1

int 값으로 당신의 DB 저장에 사용 int : 당신이 필요로하는

AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division; 

int val = (int)thisLevel; 

AggregationLevel lvlUpd = (AggregationLevel)val; 
+0

아니요 데이터베이스에서 varbinary를 사용하여 비트 마스킹을하고 싶습니다. –

관련 문제