学生証をランドン番号としてDBに入力しています
int num = r.Next(1000);
Session["number"] = "SN" + (" ") + num.ToString();
しかし、重複した番号を取得する可能性はありますか?これを回避するにはどうすればよいですか?
編集::ID列があり、学生IDはIDとは別です。ランダムな学生IDを、UIからDBに入力します。
単なる整数の一意の ID である DB 内の列を持つことは、非常に一般的なタスクです。私がこれまで扱ってきたすべてのデータベースには、それを処理するための特定の列タイプ、関数などがあります。使用する特定のデータベースによって異なりますが、それが何であるかを把握して使用する必要があります。
random int の代わりに Guid を使用できます。それらは常に一意になります
すでに存在するものをすべてチェックしない限り、int が一意であることを保証する方法はありません。
編集:
質問があるため、ここでは Guid が最適だと思います。最初にテーブルのインデックスを作成するのに時間がかかることはまったくありません。 1000行未満のテーブルでは問題ありません。
ガイドは学ぶのに良いものです - たとえそれらが常に最も効率的な方法であるとは限りません
C# で一意の Guid を作成すると、質問のように、その ID を使用して表示し続けることができるという利点があります
確かに、重複した番号を取得する可能性は非常に高いです。Next は 0 から 1000 までの数値を与えるだけですが、その数値が Next が過去に返した数値ではないという保証はありません。
一意の値を使用しようとしている場合は、整数の代わりに Guid を使用するか、乱数の代わりに常に増加する整数値を使用することを検討してください。Guid のリファレンス ページ http://msdn.microsoft.com/en-us/library/system.guid.aspx
はい、重複します。本当にユニークなアイテムが必要な場合は、Guid を使用する必要があります。引き続き数値を使用する場合は、データベースの ID 列と同様に、既に使用した数値を追跡する必要があります。
次を使用してIDの生成を試みることができますGuid
:
Session["number"] = "SN" + (" ") + Guid.NewGuid().ToString();
重複した ID を取得する可能性が大幅に減少します。
乱数を使用している場合、それを回避する方法はありません。衝突の可能性は常にあります。
おそらく探しているのは、ID列、またはデータベース サーバーに相当するものだと思います。
LINQ to SQL では、次のように行を設定できます。
[Column ( IsPrimaryKey = true, IsDbGenerated = true )]
public int ID { get; set; }
ASPで役立つかどうかはわかりませんが、良いヒントになるかもしれません...
はい、もちろん可能性はあります。
簡単な解決策:
最初に重複した番号であるかどうかを確認し、重複した番号でなくなるまで再試行してください。