通常使用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。 –