C# データテーブル:AutoInc フィールドを使用して新しい行を追加するとエラーが発生する

StackOverflow https://stackoverflow.com/questions/1775697

質問

コレクションを持っています

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オブジェクトが自動インクリメントに設定されていないということです。あなたはそのAutoIncrementAutoIncrementSeed、およびAutoIncrementStepプロパティを設定する必要があります。

データベースに1つ、あなたのDataTableで1:一度これを行う

、あなたは二つの異なる自動インクリメントの種を持っていることである第二の問題、に実行されます。これら二つの種が同じ値でから始めたとしても、それらが同期して取得するために、それは些細です:あなたのデータベーステーブルにごDataTableし、別の行に行を追加し、今は同じIDを持つ2つの異なる行を持っています<。 / P>

これは共通の問題であり、その一般的な解決策は、DataTableに追加された行のために異なる番号の配列を有することです。一般的に、これが0にシードと-1にステップを設定することによって行われるので、あなたはDataTableに追加することを、すべての行が少ない0よりもIDを持っていること(もちろんこれは、データベース内のすべてのIDはのあることを前提としていのより大きい0)DataTableに追加されたデータベースに追加された行と行の間のIDの衝突のチャンスがありませんことをこの意味ます。

あなたがデータベースに行を挿入し、そのの本当のの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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top