C# T-SQL能否存储ulong';s

C# T-SQL能否存储ulong';s,c#,.net,sql,bigint,ulong,C#,.net,Sql,Bigint,Ulong,我想将C#.NETulong存储到T-SQL数据库中。我看不到任何这样做的规定,因为SQLbigint与普通long具有相同的最小/最大值 我有什么办法可以做到这一点吗?或者捕获一个溢出异常是我唯一的希望吗?我知道这不一样,但这样做可以: select convert(decimal(38, 0), 12345678901234567890123456789012345678) 无符号long的最大值似乎是18446744073709551615,这远远小于此十进制数可以存储的值。转换时可能会

我想将C#.NET
ulong
存储到T-SQL数据库中。我看不到任何这样做的规定,因为SQL
bigint
与普通
long
具有相同的最小/最大值


我有什么办法可以做到这一点吗?或者捕获一个
溢出异常是我唯一的希望吗?

我知道这不一样,但这样做可以:

select convert(decimal(38, 0), 12345678901234567890123456789012345678)

无符号long的最大值似乎是18446744073709551615,这远远小于此十进制数可以存储的值。转换时可能会出现问题,但我相信应用程序中的几个包装函数会很快对其进行排序。

这应该可以回答您的问题:

如果使用BigInt,只需小心如何在C中将有符号类型转换回无符号类型#


另一种可能是使用长度为8的VarBinary,然后将字节转换为C#

中的ulong,因为Neil N的解决方案不起作用。Visual Studio一直抱怨我无法将
long
值分配给
ulong
变量,无论
是否选中

最终的效果很简单

ulong fileSize = (ulong)(long)reader["fileSize"];
(未选中

在SQLite DB中,该值存储为
long
,因此非常高的值变为负值,在SQL端对其排序失败。但是在获得
ulong
值后,Linq可以发挥它的魔力

items = items.OrderByDescending(x => x.FileSize).ToList();

@罗伯特·哈维:我发布了一个简短的例子,你的意思是将
long.MinValue
视为
0
long.MaxValue
视为
ulong.MaxValue
?这里正确定义了有符号位的行为吗?如果不想失去精度,就必须使用符号位作为ulong中的附加高阶位。罗伯特·哈维:这就是为什么不检查的原因。高阶位对ulong不重要,它只需要8个完整字节。@barnes:你还记得“未检查”的代码块吗?适应ulong范围的好方法,但是要知道sql报告十进制(38,0)占17个字节。你是说它对于我们要存储的数据量来说太大了吗?@Johnathan:我想是的
decimal(38,0)
bigint
的两倍多(实际上是2.125倍)。如果空格是个问题,我会有点担心。@Onion无符号长字符的长度是18446744073709551615,这意味着您只需要
十进制(20,0)
。这需要13个字节,而不是17个字节。与
BIGINT
相比,
DECIMAL
的优势在于它将保留所存储数字的语义。任何其他应用程序、ETL、报表或查看这些数字的人员都会理解它们。从数据架构师的角度来看,这证明了存储代价是合理的。另一方面,
BIGINT
将向读取器显示负数(即谎言)。请参阅哪个命令告诉您使用
十进制(20,0)检查(columnName>=0和columnName)
items = items.OrderByDescending(x => x.FileSize).ToList();