2012-10-02 40 views
0

通常使用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; 
    } 
} 

回答

0

最後我做了什麼方法讓對象負責翻譯。

SQLID的只讀簽名屬性。
對於更新回數據庫決定不應該混淆這個值。

這些對象還公開一個由其他對象,散列和UI使用的未簽名ID。

1

您可以將您的UInt32作爲Int32存儲在SQL Server中。保存到SQL時,將未簽名的整數轉換爲已簽名的整數。

大於Int32.MaxValue的UInt32值將在SQL中表示爲負數,但您可以在從數據庫讀取數據後將它們轉換回UInt32。

如果使用ADO。淨

uint hash; 

讀時的數據

while (reader.Read()) 
{ 
    uint hash = (uint)reader.GetInt32(myIndex); 
} 

當寫入數據

cmd.Parameters.AddWithValue("MyParamName", (int)hash); 

如果使用EF代碼第一次

揭露Int32類型的屬性,只是包裝你的散列值和標記實際散列屬性爲未映射

private uint hash; 

[NotMapped] 
public uint Hash 
{ 
    get { return hash; } 
    set { hash = value; } 
} 

public int HashAsLong 
{ 
    get { return hash; } 
    set { hash = value; } 
} 
+0

在哪裏和如何做鑄造然後是我的問題?而不是保存這將只是身份。但會查詢到該列。 – Paparazzi

+0

添加ADO.Net和實體框架代碼第一個示例 –

+0

關於擴展...爲什麼使用更寬的整數作爲臨時變量?你只需要使用一個寬度相同的無符號整數,例如'Int32 int32 = rdr.GetInt16(i);'可以是'Uint16 uint16 = rdr.GetInt16(i);'。添加32768不會導致uint16溢出。它將不會大於0xffff。 –

相關問題