2

学生証をランドン番号としてDBに入力しています

  int num = r.Next(1000);
  Session["number"] = "SN" + (" ") + num.ToString();

しかし、重複した番号を取得する可能性はありますか?これを回避するにはどうすればよいですか?

編集::ID列があり、学生IDはIDとは別です。ランダムな学生IDを、UIからDBに入力します。

4

9 に答える 9

7

単なる整数の一意の ID である DB 内の列を持つことは、非常に一般的なタスクです。私がこれまで扱ってきたすべてのデータベースには、それを処理するための特定の列タイプ、関数などがあります。使用する特定のデータベースによって異なりますが、それが何であるかを把握して使用する必要があります。

  • randomではなく一意の値が必要です。2つは異なります。乱数は繰り返しますが、一意ではありません。一意の番号もランダムではありません。たとえば、数字を 0 からインクリメントするだけで一意になりますが、それは決してランダムではありません。
  • 一意の GUID を使用できますが、128 ビットになります。それはかなり大きいです。ほとんどのデータベースには、アイテムを追加するたびにインクリメントするカウンターがあるだけなので、通常は 32 ビットで十分です。これにより、多くのスペースを節約できます。また、カウンターのインクリメントは、GUID の新しい値を計算するよりも高速です。多くの項目を追加する傾向がある DB 操作の場合、これは問題になる可能性があります。
  • Jodrell がコメントで言及しているように、GUID やその他の大きなフィールドを使用する場合は、インデックスのサイズも考慮する必要があります。そのインデックスの保存と維持は、より多くのビットを必要とする列を使用すると、(時間とスペースの両方で)はるかに高価になります。
  • 自分で何かをしようとすると、間違ったことをする可能性が高くなります。アルゴリズムが完全に一意ではないか、不適切な同期が原因で競合状態が発生するか、過度の同期が原因でパフォーマンスが低下するか、衝突のリスクを軽減するために必要だったため、アルゴリズムが大幅に大きくなります。一日の終わりには、データベースはあなたが持っていないツールにアクセスできるようになります。何を台無しにするか心配する必要はありません。
于 2012-10-05T16:06:23.417 に答える
3

random int の代わりに Guid を使用できます。それらは常に一意になります

すでに存在するものをすべてチェックしない限り、int が一意であることを保証する方法はありません。

編集:

質問があるため、ここでは Guid が最適だと思います。最初にテーブルのインデックスを作成するのに時間がかかることはまったくありません。 1000行未満のテーブルでは問題ありません。

ガイドは学ぶのに良いものです - たとえそれらが常に最も効率的な方法であるとは限りません

C# で一意の Guid を作成すると、質問のように、その ID を使用して表示し続けることができるという利点があります

于 2012-10-05T16:05:03.537 に答える
3

確かに、重複した番号を取得する可能性は非常に高いです。Next は 0 から 1000 までの数値を与えるだけですが、その数値が Next が過去に返した数値ではないという保証はありません。

一意の値を使用しようとしている場合は、整数の代わりに Guid を使用するか、乱数の代わりに常に増加する整数値を使用することを検討してください。Guid のリファレンス ページ http://msdn.microsoft.com/en-us/library/system.guid.aspx

于 2012-10-05T16:08:27.223 に答える
2

はい、重複します。本当にユニークなアイテムが必要な場合は、Guid を使用する必要があります。引き続き数値を使用する場合は、データベースの ID 列と同様に、既に使用した数値を追跡する必要があります。

于 2012-10-05T16:05:25.540 に答える
2

はい、確かに重複します。GUID代わりにa を使用できます。

Guid g = Guid.NewGuid();

GUID は理論的には「グローバルに一意」です。

于 2012-10-05T16:06:40.483 に答える
2

次を使用してIDの生成を試みることができますGuid

Session["number"] = "SN" + (" ") + Guid.NewGuid().ToString();

重複した ID を取得する可能性が大幅に減少します。

于 2012-10-05T16:07:25.180 に答える
1

乱数を使用している場合、それを回避する方法はありません。衝突の可能性は常にあります。

おそらく探しているのは、ID列、またはデータベース サーバーに相当するものだと思います。

于 2012-10-05T16:07:08.637 に答える
1

LINQ to SQL では、次のように行を設定できます。

    [Column ( IsPrimaryKey = true, IsDbGenerated = true )] 
    public int ID { get; set; }

ASPで役立つかどうかはわかりませんが、良いヒントになるかもしれません...

于 2012-10-05T16:14:21.160 に答える
-1

はい、もちろん可能性はあります。

簡単な解決策:
最初に重複した番号であるかどうかを確認し、重複した番号でなくなるまで再試行してください。

于 2012-10-05T16:04:24.167 に答える