1

没有找到对我的问题有用的答案,所以也许在这里试试我的运气。我正在尝试使用 C# Ado.Net 数据集将记录添加到 MSAccess mdb 文件中的表中。一切都很好,直到我尝试将新行添加到另一个用外键引用的表中。这不能按计划工作,因为在我用前一个新行更新数据表后,objectrow 仍然具有默认的“-1”id 值,因此由于外键而无法添加新行。应更新 id 值,因为该列是 MSaccess 的自动增量/身份变量类型。

我使用了通用名称,因为我用另一种语言写了这个......

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 回答