1

私の問題に対する有用な答えが見つからなかったので、ここで運試ししてください。C# Ado.Net データセットを使用して、MSAccess mdb ファイルのテーブルにレコードを追加しようとしています。外部キーで参照される別のテーブルに新しい行を追加しようとするまで、すべてうまくいきます。前の新しい行でデータテーブルを更新した後、オブジェクト行にはデフォルトの '-1' id-value がまだあり、外部キーのために新しい行を追加できないため、これは計画どおりに機能しません。列が MSaccess の auto-increment/identity-variant-type であるため、id-value を更新する必要があります。

これを別の言語で書いたので、一般的な名前を使用しました...

public void addObject(Object o)
        {

        ds.objects.Clear(); //clear datatable where ds is reference to dataset
        Data.DBManagerDataSet.objectRow row = ds.objects.NewobjectRow();

        FillRowWithVariables(row, o); //fill row with some random variables

        ds.objects.Rows.Add(rij);
        taObjects.Update(ds.objects); //tell tableadapter to update objects

        Object2 p = AddObjectWithSomeRandomVariables(o.RandomVariable);

        Data.DBManagerDataSet.object_otherobjectRow linkrow = ds.object_otherobject.Newobject_otherobjectRow(); //new row to reference the other one

        linkrow.object_id = row.object_id;
        linkrow.otherobject = p.Id;
        ds.object_otherobject.Rows.Add(linkrow);
        taobject_otherobject.Update(ds.object_otherobject);

        }

手助け?

4

1 に答える 1

2

これを行う方法を説明している MSDN の記事があります (下部にある Access のサンプル コードを含む): http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx

編集:

MSDN で推奨されている方法はOleDbDataAdapter.RowUpdated、挿入された行の自動番号を取得するイベント ハンドラーをイベントに追加することです。

private static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs e)
{
    // Conditionally execute this code block on inserts only.
    if (e.StatementType == StatementType.Insert)
    {
        OleDbCommand cmdNewID = new OleDbCommand("SELECT @@IDENTITY", connection);
        // Retrieve the Autonumber and store it in the CategoryID column.
        e.Row["CategoryID"] = (int)cmdNewID.ExecuteScalar();
        e.Status = UpdateStatus.SkipCurrentRow;
    }
}
于 2013-05-09T00:49:30.853 に答える