1

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

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列、タイプ番号、autoinc、Employeeクラス、およびDataTable / Collectionsメソッドを修正する方法があるため、新しい行を追加するときにid列は「無視」されますか?

ありがとう

4

2 に答える 2

3

最初の問題はid、データベースで列が自動インクリメントされている間、その列DataColumnに対応するオブジェクトがDataTable自動インクリメントに設定されていないことです。AutoIncrement、、、AutoIncrementSeedおよびAutoIncrementStepプロパティを設定する必要があります。

これを行うと、2番目の問題が発生します。これは、2つの異なる自動インクリメントシードがあることです。1つはデータベースにあり、もう1つはにありますDataTable。これらの2つのシードが同じ値で始まったとしても、同期が外れるのは簡単です。1つの行をデータベーステーブルに追加しDataTable、別の行をデータベーステーブルに追加すると、同じIDを持つ2つの異なる行ができます。

これは一般的な問題であり、その一般的な解決策は、に追加される行に異なる番号付けシーケンスを設定することDataTableです。通常、これはシードを0に設定し、ステップを-1に設定して、追加するすべての行のDataTableIDが0未満になるようにします(もちろん、これはデータベース内のすべてのIDが0より大きいことを前提としています。 )これは、データベースに追加された行とに追加された行の間でIDが衝突する可能性がないことを意味しますDataTable

次に、からデータベースを実際に更新するときにDataTable、行をデータベースに挿入し、その実際のIDが割り当てられた後、のIDをDataRow正しい値に変更します。行が親としてデータリレーションに参加している場合は、DataColumnカスケード更新を設定する必要があります。そのため、親行のIDを一時的なローカル値から永続的な値に変更すると、関連する子行のIDも変更されます。

型付きデータセットとテーブルアダプタを使用する多くの理由の1つは、この作業がすべて自動的に行われることです。ただし、テーブルアダプタを使用していない場合は、自分で行う必要があります。ADOのドキュメントにはこの良い例があります

于 2009-11-21T20:09:02.127 に答える
0

どのようにテーブルを設定しましたか?

このコードは、プロパティの使用方法を示す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;
}
于 2009-11-21T15:13:50.290 に答える