DataTableをFillした後に手動でAddする分のためにDataColumn.AutoIncrementを設定しているけどそれはなんかタイミング的に駄目な気がするよと思ったので検証。
DataTable table1 = new DataTable();
table1.Columns.Add();
table1.Columns[0].AutoIncrement = true;
table1.Rows.Add();
table1.Rows.Add();
table1.Rows.Add();
foreach (DataRow row in table1.Rows)
{
Debug.Print(row[0].ToString());
}
//0
//1
//2通常。
DataTable table2 = new DataTable();
table2.Columns.Add();
table2.Columns[0].AutoIncrement = true;
table2.Rows.Add(1);
table2.Rows.Add();
table2.Rows.Add();
foreach (DataRow row in table2.Rows)
{
Debug.Print(row[0].ToString());
}
//1
//2
//3事前に追加された値からインクリメント。
DataTable table3 = new DataTable();
table3.Columns.Add();
table3.Columns[0].AutoIncrement = true;
table3.Rows.Add(2);
table3.Rows.Add(1);
table3.Rows.Add();
foreach (DataRow row in table3.Rows)
{
Debug.Print(row[0].ToString());
}
//2
//1
//3事前に追加された最大の値からインクリメント。
DataTable table4 = new DataTable();
table4.Columns.Add();
table4.Rows.Add(1);
try
{
table4.Columns[0].AutoIncrement = true;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
//'String' 型 の DataColumn AutoIncrement は、一度データが設定されたら変更できません。数値型でないデータが保持されている場合、AutoIncrement設定不可。
DataTable table5 = new DataTable();
table5.Columns.Add();
Debug.Print(table5.Columns[0].DataType.ToString());
//System.String
table5.Columns[0].AutoIncrement = true;
Debug.Print(table5.Columns[0].DataType.ToString());
//System.Int32
AutoIncrement設定でDataColumn.DataTypeが変化。
DataTable table6 = new DataTable();
table6.Columns.Add();
table6.Columns[0].DataType = System.Type.GetType("System.Int32");
table6.Rows.Add(2);
table6.Columns[0].AutoIncrement = true;
table6.Rows.Add(1);
table6.Rows.Add();
foreach (DataRow row in table6.Rows)
{
Debug.Print(row[0].ToString());
}
//2
//1
//2AutoIncrementが設定されてから追加された最大の値からインクリメント。
DataTable table7 = new DataTable();
table7.Columns.Add();
table7.Columns[0].DataType = System.Type.GetType("System.Int32");
table7.Rows.Add(2);
table7.Columns[0].AutoIncrement = true;
table7.Columns[0].Unique = true;
table7.Rows.Add(1);
try
{
table7.Rows.Add();
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
//列 'Column1' は一意であるように制約されています。値 '2' は既に存在します。AutoIncrementはただインクリメントするだけなので、Unique制約は考慮されない。
Fillする前に設定するか、Fillした後であればAutoIncrementSeedも設定するとか。