C# データテーブル:AutoInc フィールドを使用して新しい行を追加するとエラーが発生する
-
21-09-2019 - |
質問
コレクションを持っています
List<Employee> employees;
DataTable を使用し、Form1.Loads 時にすべてのレコードを (MDB テーブルから) ロードし、これらのレコードをリスト (コレクション) に追加して、メモリ内で作業できるようにします。
さて、新しい従業員をコレクションに追加するときは、それを mdb テーブルにも追加する必要があります...私もです:
DataRow rowemployee = Program.tblEmployee.NewRow();
rowemployee["name"] = tb_Name.Text;
rowemployee["address"] = tb_Address.Text;
//...all the other fields
Program.tblEmployee.AddRow(rowemployee);
IDE は、「id」列に null 値を含めない、または空にすることはできないというエラーをスローします。
mdb テーブルには id 列があるため、number、autoinc、と入力します。 新しい行を追加するときに id 列が「無視」されるように、Employee クラスと DataTable/Collections メソッドを修正するにはどうすればよいですか??
ありがとう
解決
最初の問題はid
列がデータベースで自動インクリメントしながら、あなたのDataColumn
でそれに対応するDataTable
オブジェクトが自動インクリメントに設定されていないということです。あなたはそのAutoIncrement
、AutoIncrementSeed
、およびAutoIncrementStep
プロパティを設定する必要があります。
DataTable
で1:一度これを行う、あなたは二つの異なる自動インクリメントの種を持っていることである第二の問題、に実行されます。これら二つの種が同じ値でから始めたとしても、それらが同期して取得するために、それは些細です:あなたのデータベーステーブルにごDataTable
し、別の行に行を追加し、今は同じIDを持つ2つの異なる行を持っています<。 / P>
これは共通の問題であり、その一般的な解決策は、DataTable
に追加された行のために異なる番号の配列を有することです。一般的に、これが0にシードと-1にステップを設定することによって行われるので、あなたはDataTable
に追加することを、すべての行が少ない0よりもIDを持っていること(もちろんこれは、データベース内のすべてのIDはのあることを前提としていのより大きい0)DataTable
に追加されたデータベースに追加された行と行の間のIDの衝突のチャンスがありませんことをこの意味ます。
DataTable
にIDを変更した後、あなたが実際に、DataRow
からデータベースを更新する次に、。行が親としてのデータの関係に参加している場合は、DataColumn
は連鎖更新はとてもその永久値への一時的なローカル値から親行のIDを変更すると、関連する子行にIDを変更することを、設定されている必要があります。
入力されたデータセットとテーブルアダプタを使用するには多くの理由の一つは、この作品のすべてが自動的に行われることです。あなたは、テーブルアダプタを使用していない場合でも、あなたはそれを自分で行う必要があるでしょう。この中 ADOのドキュメントの
他のヒント
あなたがテーブルを設定しているどのように?
このコードは、 DataRow.ItemArray
プロパティMSDNページからですAutoIncrement
プロパティが使用されている様子を示しの
private DataTable MakeTableWithAutoIncrement()
{
// Make a table with one AutoIncrement column.
DataTable table = new DataTable("table");
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"));
idColumn.AutoIncrement = true;
idColumn.AutoIncrementSeed = 10;
table.Columns.Add(idColumn);
DataColumn firstNameColumn = new DataColumn("Item",
Type.GetType("System.String"));
table.Columns.Add(firstNameColumn);
return table;
}