通常使用SQL Identity作为.NET对象的ID。
从0或1开始标识,因为不希望对象具有负ID。
该ID显示给用户,因此它需要符合人类。SqlDataReader将SQL签名转换为.NET无符号整数
也经常使用类似((Int32)key1 < < 32)+ key2;为散列
如果unsigned可以用更快的(UInt32)key1 < < 32 | KEY2;
由于SQL没有无符号数据类型,因此一半范围内丢失。
在.NET中将SQL签名转换为无符号的最佳做法是什么?
其中转换从0到最大。
直接投射不能用作(UInt16)Int16.Min = Int16.Max +1。
需要将Int16.Min转换为0并将Int16.Max转换为UInt16.Max。
在SQL中,将数据类型的标识种子设置为最小值(或最小值+1)。
目前有一种情况,即将通过Int32 max吹,但怀疑它会永远超过UInt32 max。如果它确实超过了UInt32 max,那么应用程序和数据库将需要完整的评论。
试过对SqlDataReader的扩展,它似乎工作。
将作为答案发布。
尚未投入生产,因此请检查以获得更好的结果或警告有关该方法。
不需要DataTable兼容性,因为这个应用程序使用零,永远不会。
我们不使用实体框架也不使用SQL LINQ。垃圾TSQL和SP。
public static class MyExtensions
{
public static UInt16 GetUInt16(this SqlDataReader rdr, int i)
{
//return (UInt16)rdr.GetInt16(i); // wrong answer
Int16 int16 = rdr.GetInt16(i);
UInt16 uint16 = (UInt16)(int16 + 32768);
return uint16;
}
public static UInt32 GetUInt32(this SqlDataReader rdr, int i)
{
Int32 int32 = rdr.GetInt32(i);
UInt32 uint32 = (UInt32)(int32 + 2147483648);
return uint32;
}
}
在哪里和如何做铸造然后是我的问题?而不是保存这将只是身份。但会查询到该列。 – Paparazzi
添加ADO.Net和实体框架代码第一个示例 –
关于扩展...为什么使用更宽的整数作为临时变量?你只需要使用一个宽度相同的无符号整数,例如'Int32 int32 = rdr.GetInt16(i);'可以是'Uint16 uint16 = rdr.GetInt16(i);'。添加32768不会导致uint16溢出。它将不会大于0xffff。 –