2012-03-21 8 views
0

私は管理者がアップデートを追加、編集、削除できるアップデート用のコンテンツ管理システムを開発中です。SQL - isIdentityカラムの次の値を取得

管理者がアップデートを追加する形式では、データベースの「Update_ID」というisIdentity列の次の値を表示するテキストボックスを作成します。管理者がデータベース内の最後のレコードを削除した場合、テキストボックスの値は次の行の実際の 'Update_ID'を反映しないため、データベースから最後の行を取得して1を追加するだけではなりません。

どうすれば解決できますか?データベースの次のisIdentityカラムの実際の値を取得する方法はありますか?ありがとう:)

+4

それだけで1ミリ秒後に異なる場合がありますので、あなたはその値をdiplayする何のためにする必要がありますか? ** [SCOPE_IDENTITY](http://msdn.microsoft.com/de-de/library/ms190315.aspx)(SQL-Server)を介して作成され、取得された後にのみ**信頼されます。 –

+0

@Tim Schmelter私は 'Add Update'フォームに値を表示する必要があります。しかし、同じフォームからイメージを追加するときにSQL文でこの値を使用する必要があります。これは実際の問題が発生したときです。 – Matthew

+0

@Steve SQL Server 2008を使用しています。管理者がID 23の最後の行を削除して後で更新プログラムを追加すると、テキストボックスの値が23に表示され、23から同じイメージを追加するときに23が使用されますフォームに挿入する行の実際の値は24です。 – Matthew

答えて

3

このようなことに興味があるならば、唯一の効果的な方法は、実際に空の行を挿入し、その行を編集のためにユーザーに戻すことです。次のIDは挿入のためにテーブルをロックすることなく実行されます。これはおそらくあなたがしたいことではありません。

ユーザーが最初にデータを入力したときにUpdate_IDフィールドに入力しないでください。その後、SCOPE_IDENTITYを選択するか、insertステートメントから値を返すことで、後で作成したIDを通知します。

EDIT:あなたは(あなたは、SQL Server 2012にアップグレードすることを選択した場合)何をしたいのかについて 一つの可能​​な選択肢は、新しいSequences機能を使用することです。私はこれまでにそれを使用したことはありません。

+0

ありがとう:)問題は、同じフォームからイメージを挿入するときに同じ 'Update_ID'番号が使用されることです。私の質問の下の最後の2つのコメントを見てください。 – Matthew

+0

私は非常に混乱しているコメントを見つける。 IDをどうやってやっているのか分かりません。システムの設計が何を想定しているのか分かりません。いずれにしても、次のIDENTITY値(おそらくIDENT_CURRENT)を知り、その知識を使用して関連データをまだ発生していない挿入物にタグ付けすることは、災害のためのレシピです。 –

+0

@Matthew:編集を参照してください。 SQL 2012へのアクセス権があるのだろうか? ;-) –

1

あなたセッションやテーブルのスコープの最後に挿入されたID値を取得するには、ここにいくつかの読書であることができます:

しかし、あなたはそれらのことを覚えておく必要があります値はテーブルに挿入されるたびに変化するため、それらを信頼することはできません。最善の方法は、この値を前面に表示しないことです。関連リソースの場合は、マスター表に挿入し、SCOPE_IDENTITYを取り出して、取り出した値を持つ子表に挿入するストアド・プロシージャ(またはインラインT-SQLブロックのみ)を作成できます。 (ADO.NETで)私は、上述したものの単なる例

EDIT

using (SqlConnection connection = new SqlConnection(_connectionString)) 
{ 
    connection.Open(); 

    SqlTransaction transaction = connection.BeginTransaction(); 

    int insertedIdentity; 
    using (SqlCommand command = new SqlCommand("INSERT INTO TableNames(ColumnsList) VALUES(@ValuesList) SELECT @InsertedIdentity = SCOPE_IDENTITY()", connection, transaction)) 
    { 
     command.CommandType = CommandType.Text; 
     //Add any parameters required by INSERT here, then add parameter for SCOPE_IDENTITY 
     ... 
     command.Parameters.Add(new SqlParameter("@InsertedIdentity", SqlDbType.Decimal) { Direction = ParameterDirection.Output }); 
     command.ExecuteNonQuery(); 
     insertedIdentity = Convert.ToInt32(command.Parameters["@InsertedIdentity"].Value); 
    } 

    //Now you can make all the child inserts using insertedIdentity and transaction 
    ... 

    transaction.Commit(); 
} 
関連する問題