2009-04-17 11 views
1

asp.net、c#、sqlサーバとlinq to sqlを使用したフォーラムアプリケーションがあります。挿入ボタンが押されたときだけでなく、ブラウザをリフレッシュしたり、バックをクリックしたりしたときにも、複数の挿入が問題になります。重複した挿入をデータベースに止める最も良い方法は何ですか

最も包括的な方法、またはこれを防止する方法は何ですか。

更新: 私は現在、テキストを挿入した後にresponse.redirectを使用します。 私はおそらく正しいアプローチは、応答を読むと、javascriptですぐにボタンを無効にすることだと思いますか? フォームの隠しフィールド(またはセッション?)に一意の値を保存します。 dbにこの値のフィールドを作成し、このフィールドに対してこの一意の値をチェックしますか?

おかげ

+0

?あなたは並行性があり、それは苦しんでいますか?ああ、私。 –

答えて

8
  1. 各ページへUNIQUEクッキーや隠しコントロールを割り当て
    • はこのクッキーや制御値を保持しているテーブル内のUNIQUEフィールドを作成します。
    • レコードが同じCookieで挿入されている場合、INSERTは失敗し、この条件を処理(または無視)できます。
+3

データベーステーブルをトランジェントトークンでクラッタします。ただし、解決策はそれ以外の点では正しいです。アクティブトークンをデータベースに保存する必要はなく、セッションからトークンを削除します。 – JeeBee

0

入力データ・ストリームの1つ以上の列から自然主キーを選択します。これらの列を使用して、表に対して主キー制約を宣言します。サロゲート・キーにすでにプライマリ・キー制約があり、それを削除したくない場合は、代わりにナチュラル・キーにUNIQUE制約を宣言します。

アプリケーションが重複行をテーブルに挿入しようとすると、エラーが発生します。しかし、あなたはエラーを解決するためにアプリをプログラムし、正しいことをしなければならないでしょう。

+0

主キーは、送信されるデータには関係しません。サロゲート・キーを使用することもできますが、これをプライマリ・キーとして使用することはできません。 – cjk

+1

テーブルにプライマリキーがあります。挿入ボタンをクリックすると問題が発生します。ユニークなIDを使用して一意のエントリが送信されます – Stuart

+0

プライマリキーは一意の制約を意味します。主キーは作成するオートナンバー列の一部にすることができますが、入力ストリームの1つ以上の列に含めることもできます。試してみてください、それは好きかもしれません! –

5

私は挿入や更新を行うページを持っていますが、同じページにResponse.Redirectだけであっても、通常、更新が完了した後で別のページにResponse.Redirectを行います。そうすれば、ページが更新されたときにデータを再投稿することはありません。

+0

良い答え。また、ボタンをすぐに無効にしてダブルクリックを止めることもできます。 – cjk

+0

これは良いアイデアだと思いますが、dbに挿入した後、私は同じページにデータを表示したいと思っています。ページが別のページとして表示されますが、ページに埋め込まれ、テキストが追加されたときに表示/非表示になります – Stuart

+0

これも私たちのために働いています。 – Mark

3

あなたの問題は実際にあなたのデータベースに固有ではないことに注意してください。送信された複数のブラウザリクエストに問題があり、その問題を回避する必要があります。上述したようにデーブによってリダイレクトパターンを使用するか、

一例を署名クッキーを使用するか、ここでhttp://aspalliance.com/711_Preventing_Duplicate_Record_Insertion_on_Page_Refresh_or_Postback_of_a_Web_Form

2

あなたは私はあなたが新しいを使用することをお勧めすることを行うことができない場合は、主キーまたはユニーク制約を使用していますそれが存在しない場合に挿入するMERGEステートメント、または存在する場合は更新する(ビジネスルールがわからないため、状況に応じて動作しない可能性があります)MERGEはSQL Server 2008以降です

+0

マージはソリューションの良い部分のように聞こえますが、SQLのみを取得しました – Stuart

0

コメント用のフォームを作成し、データベースにコメントとともに記録します。存在しない場合は、挿入を実行する前にその一意のIDを持つコメントのチェックを実行します。

ユーザが一度にアクティブなサイトにいくつかの返信を許可するには、最初にサーバ側にトークンを割り当て、そのユーザのセッション上のアクティブなポスティングトークンのリストにそのトークンを入れて、フォームフォームのサブミッションは、そのトークンがセッション上のリストにある場合にのみデータベースに挿入されます(データベースに正常に挿入された後にセッションのリストから削除されます)。 これにより、上記のようにデータベースに投稿トークンを保存する時間が節約されます。

0

重複しないように、データの自然キーに一意なインデックスを付けます。必要な場合は、テーブルのすべてのフィールド(挿入日時にシステム日付を受け取る任意の日付指向の日付や、挿入者のユーザIDを含むバックエンドだけで使用されるフィールドを除く)挿入を除く)。

2

PostBack RitalinというASP.NET AJAXコントロールを、仲間のSO Dave Wardからチェックしてください。これは、あなたのjavascript disablerのアイデアに対する既にテスト済みの解決策を手伝ってくれるでしょう。

+0

これをチェックしてみましょう。 – Stuart

関連する問題