2009-06-18 10 views
3

私は、AutoIncrement列を持つデータテーブルを持っています。新しい行を追加せずに列の次のインクリメント(-1、-2、-3、...)を取得するにはどうすればよいですか?datatable列の次のautoincrement値を取得しますか?

+0

私はちょうど興味があります、なぜあなたはそれを行う必要がありますか? –

+0

私は1対1または1対1の関係を持つ親テーブルと子テーブルを持っています。私は両方の列を持つDataGridViewを表示し、子があるかどうかにかかわらず、親からのすべての行を表示したいが、子要素(本質的に2列)はまだ編集可能でなければならない。したがって、子がすでに存在する場合、既存の子の子列の編集はデータベースの編集を行いますが、存在しない子の編集は挿入​​を生成します。挿入用のIDを生成する必要はありません(一時的な一時的なものであるため)。将来の拡張機能にはこれが必要な場合があります。 – Rado

答えて

6

デザインに合っていれば、いつでも新しい行(datatable.newrow)を作成することができ、すでにnextIdが割り当てられています。今は無駄になっていますが、行はあなたがAcceptChangesまでテーブルにコミットされていません。

+0

私が探していた答えではありませんが、テーブルが空でIDENT_CURRENTがまだ返されていれば – Rado

-2

自動増分値は常にその列の最大値であるため、max(列名)+1を使用して取得することができます。

+0

行を追加して削除しても機能しません。それは、私はその質問に対する答えがない、と言った。 –

+0

またはAutoIncrementStepが1以外の場合。アカウントへの取り込みは簡単ですが、まだdaughtkomのメモによって制限されています。 – hometoast

+3

自動インクリメント値が常に最大値であるとは限りません。実際には、負のIDを使用するのは一般的なパターンであり、クライアントによって追加された行に対して-1の増分があり、更新時にデータベースからの値に置き換えられます。 – Joe

1

DataTableに対してSelectメソッドでMAX関数を使用できます。以下のような

何か(構文が完全に正しくない可能性があります):

DataRow row = dt.Select("MAX(id)")[0]; 
int nextId = row["id"] + 1; 

MSDNには、使用できるすべての式を持つページがあります。 DataColumn..::.Expression Property

1

私は AutoIncrement列を持つデータテーブルを持っています。

AIカラムを持つデータテーブル、またはAIカラムを持つSQLデータベースがありますか?列を持つSQLデータベースの場合は、DataTableが切断されているため、次の値を取得できません。それ以外の場合は、挿入を行い、@@ IDENTITYまたは同様の機能を使用するまで待つ必要があります。

+0

これはAI列のデータテーブルです – Rado

0

SQL Serverを使用している場合は、あなたができる:

SELECT cast(last_value as integer)+cast(increment_value as integer) 
FROM sys.identity_columns 
WHERE object_id=(SELECT id FROM sys.sysobjects WHERE name='PACLogErros') 
AND name='ERRCod' 
0

最良の方法は、我々はSQLは、次のアイデンティティを計算しているアルゴリズムを推測することはできませんのでアンドリューが述べたように@@ IDENTITYを使用することです複数の人がデータベースを更新すると考えると、データベースに行を保存しようとすると計算したID値が同じにならない

7

私はこの問題を解決しました(回避策なし):

次の自動iを取得するにはSQLServerのからncrement値:

SELECT IDENT_CURRENT('table_name'); -- This will fetch the present auto-increment value. 

したがって、

SELECT IDENT_CURRENT('table_name')+1; -- Next auto-increment value. 

行がアイデンティティをテーブルから削除されている場合、これは中断されませんし、キーが連続していないです。

希望に役立ちます。

+0

を実行する必要があります。 ** 0 **と思われます。 1を返し、1をインクリメントすると2になります。これは間違っています。 –

関連する問題