2011-01-11 28 views
0

削除されたレコードを持つデータベースを継承しました。私はニュース項目の表に取り組んでいます。これは、これらのレコードが削除されたIDが不足していることを意味します。 アーカイブ内の任意のニュース記事を開くことができます(1000秒)。次に、次と前のボタンを使用してすべてのニュース記事をナビゲートします。現在、削除された次のレコードに移動すると、ファイルのレコードセットの終わりがスローされ、「ニュースアイテムが使用できなくなりました」という既定のメッセージが表示されます。 この不足しているレコードを検出し、次の有効なニュース記事(IDなど)に移動する方法はありますか?私はこのサイトの古いaspを使用しています、レコードセットをナビゲートする際にこれを検出する方法はありますか?このタイプの機能はデータベースから来なければなりませんか?助けてくれてありがとう。レコードが選択されていない場合(削除されている場合) - 次の有効レコードを選択します。

+0

あなたは数値IDを使用してこれらの項目を特定していて、前および次のボタンは、単に追加または1を減算した場合、それは、それを意味するものではありませんアイテム3 doesnの場合アイテム2を開くので、前のボタンはアイテム2に再びリンクしますか?これは現在どのように機能していますか? – Rob

+1

SQLサーバーのバージョンは? –

答えて

1

SQL Server 2005以降については、MSDNを参照してください。

row_numberを使用すると、連続する数値列を作成できます。

0

1)もちろんフロントエンド(あなたの 'レコードセットのファイルの終わり')に影響を与えることが分かっているので、手動でIDを増減することができ、DBから別のレコードを取得しようとすると、データベースに入ることなく実行できます。しかし、行の中の多くのレコードが欠落していると、これは非常に効果的ではありません。私は代わりにデータベースのコードを変更することをお勧めします。 @Idは、あなたがフェッチしようとしている識別子である

SELECT * FROM News WHERE [email protected] 

:あなたはこのようなクエリを持っていると仮定すると

。代わりに、次のようなものがあります:

SELECT * FROM News WHERE Id=(SELECT MIN(Id) FROM News WHERE Id>[email protected]) 

これにより、最初に利用可能なレコードを選択することができます。 MINの代わりにMAXを使用し、> =の代わりに< =を使用して、前のニュース項目を検索します。上記の例は次のニュース項目で機能するはずです。

また、このアプローチでは、探していたものではなく、データベースからフェッチした値に基づいて、次/前のレコードの識別子を増減する必要があることを忘れないでください。例:SQLテーブルには次の識別子があります(1,5,12,21)。あなたはId = 1のニュースアイテムを開いています。 '次へ'ボタンはId> = 2を探し始め、Id = 5のレコードを返します。あなたがそれを開くと、あなたの「次へ」ボタンはId> = 6(2ではない)のレコードを探します。

次の点は、フェッチしようとしているレコードの識別子だけでなく、検索する方向も指定する必要があることです。また、このパラメータはhttpクエリ文字列で渡す必要があります。 ?以下のURLを持つすべてのページが同じ項目が表示されますので、

また、このアプローチは非常にユーザーフレンドリーではないことがあります?
サイト/ news.aspをIdは= 2 &方向=次
サイト/ news.asp同上= 3 &方向=次
サイト/ news.asp?ID = 4 &方向=次
サイト/ news.asp?次のID = 5 &方向=

2)だから、多分それはよりUSER-になりますあなたがcを表示しているときに、どのレコードが前もって前にあるかどうかを判断することができます尿道記録

SELECT (SELECT MAX(Id) FROM News WHERE Id<@Id) as previousId, (SELECT MIN(Id) FROM News WHERE Id>@Id) as nextId 

をして、それに対応し、あなたの「次へ」&「前」ボタンのURLを更新します。この場合、あなたは次のようにクエリを実行する必要があります。したがって、前の例ではId = 5のニュースアイテムを開くと 'previous'ボタンはId = 1に直接ナビゲートし、 'Next'ボタンはId = 12にナビゲートします。

私は2番目のアプローチがより少ない変更で実装でき、対応するレコードが利用できない場合は '次へ' & 'Previous'リンクをグレーアウトすることもできますpreviousIdまたはnextIdのクエリによってNULLが返されることによって)。

ホープ、このことができます:)

3
SELECT TOP 1 * 
FROM news 
WHERE id >= @next_id 
ORDER BY 
     id 
関連する問題