0

多くの場合、.NETオブジェクトのIDとしてSQLIDを使用します。
オブジェクトに負のIDを持たせたくないので、IDを0または1から開始します。
IDはユーザーに提示されるため、人間にとって論理的である必要があります。

また、((Int32)key1 << 32)+key2;のようなものをよく使用します。ハッシュの
場合署名されていない場合は、より高速な(UInt32)key1 << 32 | key2;

SQLには符号なしデータ型がないため、範囲の半分が失われます。

.NETでSQL署名付きから署名なしに変換するための良い習慣は何ですか?

変換が0から最大になる場所。
ストレートキャストは、(UInt16)Int16.Min =Int16.Max+1としては機能しません。
Int16.Minを0に、Int16.MaxをUInt16.Maxに変換する必要があります。

SQLでは、データ型のIDシードを最小(または最小+1)に設定します。

現在、Int32 maxを吹き飛ばそうとしている状況がありますが、UInt32maxを超えることはないと思われます。UInt32 maxを超えた場合は、アプリとデータベースを完全に確認する必要があります。

SqlDataReaderの拡張機能を試しましたが、機能しているようです。
回答として投稿します。
まだ本番環境に移行していないので、SOをチェックして、より良いものやアプローチに関する警告を確認してください。

このアプリはゼロを使用し、決して使用しないため、DataTableの互換性は必要ありません。

EntityFrameworkもSQLLINQも使用していません。グランジ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;
    }
}  
4

2 に答える 2

1

UInt32 を Int32 として SQL Server に格納できます。SQL に保存するときに、符号なし整数を符号付き整数にキャストします。

Int32.MaxValue より大きい UInt32 値は、SQL では負の数値として表されますが、データベースから読み取った後に UInt32 にキャストすることができます。

ADO.Net を使用する場合

uint hash;

データ読み込み時

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

データ書き込み時

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

EF Code First を使用する場合

ハッシュ値をラップするだけの Int32 型のプロパティを公開し、実際のハッシュ プロパティをNotMappedとしてマークします。

private uint hash;

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

public int HashAsLong 
{ 
    get { return hash; }
    set { hash = value; }
}
于 2012-10-02T18:21:43.460 に答える
0

最後に、オブジェクトが翻訳を担当するようにしました。

sqlID の読み取り専用の署名付きプロパティ。
データベースに戻る更新については、その値を台無しにしないように決定しました。

オブジェクトは、他のオブジェクト、ハッシュ、および UI によって使用される署名されていない ID も公開します。

于 2012-10-06T19:38:25.143 に答える