【问题标题】:How to Convert an Enum to an array of Bytes?如何将枚举转换为字节数组?
【发布时间】:2011-09-07 09:22:02
【问题描述】:

我有一个如下的枚举:

[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 参数?

谢谢,

【问题讨论】:

  • 如果你需要 Department 和 Division,你需要 AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;(注意 | 而不是 &amp;)。
  • 能否将 Int 传递给 sql 参数还是必须是字节数组?
  • 这里可能会产生误解。您是否可能需要一个项目数组,其中每个元素都是AggregationLevel 中的值的一部分?即,您需要一个包含 7 个项目的数组来代替该推理。但是,您可能希望将枚举的 int 值存储在 DB 中。
  • @Kolja,是的 Int 可以传递给参数;谢谢。
  • @Abel,数据库中的值最好是 varbinary,因为我现在可以使用 & 来比较值,请参见:consultingblogs.emc.com/jamesrowlandjones/archive/2008/07/04/…

标签: c# stored-procedures enums varbinary


【解决方案1】:

一些事情..

1) 您需要使用 OR 而不是 AND:

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;

2) 您可以使用这个序列,这样您就不必记住十进制中 2 的幂:

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

3) 最后,varbinary 不是你想要的。查看integerbigint。枚举存储为ints 或longs,并且您受限于intlong 中的位数。如果您确实想存储在varbinary 中,您需要将一个值序列化为一串字节,这将取决于您是否需要大端序,应该使用多少字节进行存储 - 也许它甚至变量等。需要更多信息。

#3 的两个选项:

A.如果只是您/您控制的代码,请不要使用 varbinary,使用 int 或 bigint(取决于所需的位数)。更好的是(可能),如果您要查询它们,请改用位字段

B.如果不是,DBA 或应用程序提供者将能够指定他们希望如何填充 varbinary

希望对您有所帮助。

【讨论】:

  • 谢谢。在我想做的存储过程中,例如i & 2 所以需要 varbinary 但我意识到从 c# 传递整数也可以。所以
  • i &amp; 2 不限于varbinary。 SQL 中的按位运算不是问题,如果有的话,整数类型会更好地工作:msdn.microsoft.com/en-us/library/ms176122.aspx
【解决方案2】:

在您的数据库中使用int 并存储为int 值:

AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;

int val = (int)thisLevel;

AggregationLevel lvlUpd = (AggregationLevel)val;

【讨论】:

  • 不,我想在数据库中使用 varbinary 来进行位掩码。
【解决方案3】:

您不需要将其存储为“字节数组”,组合值可以轻松地放入单个整数中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 2021-03-10
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多