以下情景:您在C#中有几个与SQL Server中的Enum-ish表绑定(实际上由其生成)的标志枚举。假设您是分销商,并且您允许您的分销商指定他们运送到的美国州。作为一个辉煌和优雅的软件工程师,你实施这些为按位组合的标志值,以节省存储:使用64位有符号值在SQL和C#中模拟128位无符号整数?
create table USState (
StateID bigint, StateAbbr char(2), StateName varchar(50))
/* insert all US States + DC into USState, StateIDs must be in powers of two */
/* StateID 0 reserved for 'None': */
create procedure GetStatesByFlag (@StateFlags bigint) as
declare @StateIDs table
(
StateID bigint,
primary key (StateID)
)
insert into @StateIDs
select StateID
from USState
where @StateFlags & StateID != 0
or (@StateFlags = 0 and StateID = 0)
select s.StateID, s.StateAbbr, s.StateName
from
USState s join
@StateIDs si
on si.StateID = s.StateID
甜。您可以使用按位逻辑在SQL和C#中动态地包含/排除,这使您可以即时保存复选框列表并在Asp.NET中选择列表,同时仍然只存储一个64位数字以保存任意组合选项。在你的过程的WHERE子句中,你不需要一个不可索引的比较运算符,除了最大为64行的枚举表本身。在印第安纳州和加利福尼亚州发货的每个人都可以使用平等比较和索引来搜索您的分销商。
现在你有一个要求增加对美国领土,军队邮政编码和加拿大省份的支持,并且以向后兼容的方式这样做。有没有削减名单到< 64项,而业务真的希望避免必须从其他领土和部门隔离旧校区国家。
你是做什么的?
创造性的答案是赞赏,但真正的挑战是这样的:有没有办法强制相同的按位数学运算在无符号64位值工作在签名的同时使用负空间超过64位可能的位,在C#和SQL(2008)?如果它很重要,则标志被模拟,而不是“真正的”标志,所以在技术上不需要使用[Flags]属性来处理CLR枚举。
组合是的,但在这种情况下,组合就像向印第安那州和加利福尼亚州运送,而不是一个州。无论如何,也许你可以尝试使用GUID?它们实际上是128位整数。 – kubal5003 2009-11-14 00:46:17
负性空间只是64位中的一个,所以没有。 – Joe 2009-11-14 01:45:48
我遇到了完全相同的问题。你如何使用GUID来存储数字? – arao6 2014-10-28 02:55:48