如何用nHibernate存储128位整数?

时间:2011-09-02 10:56:12

标签: c# sql nhibernate firebird

问题:

如何使用nHibernate存储128位整数(IPv6)?

特别是在Firebird上,BigInteger MAX大小为2 ^ 64。

我想做以下计算:

SELECT * FROM T_Country_IP_Range 
WHERE 
(block_from <= @in_IP) 
AND (block_to >= @in_ip)

因此不能将它存储为text / varchar / char。

1 个答案:

答案 0 :(得分:2)

似乎确实没有针对INT128的火鸟支持。

你可以做的是将128位表示为两个64位字段,一个字段中的高64位(IP_upper)和另一个字段中的低64位(IP_Lower)。

所有比较操作都必须比较两个字段。如果上部字段较小/较大或相等,则检查下部字段:

SELECT * FROM T_Country_IP_Range 
WHERE 
(
    block_from_upper < @in_IP_upper 
    OR 
    (block_from_upper = @in_IP_upper AND block_from_lower <= @in_IP_lower)
) 
AND 
(
    block_to_upper > @in_IP_upper 
    OR 
    (block_to_upper = @in_IP_upper AND block_to_lower >= @in_IP_lower)
)

有点尴尬,毫无疑问