我有一个带有两个 DataGridViews 的 winforms 应用程序,显示我的 Person 和 Address 表中的主从关系。Person 表有一个 PersonID 字段,它是自动递增的主键。Address 有一个 PersonID 字段,即 FK。
我用 DataAdapter 填充我的 DataTables 并设置 Person.PersonID 列的 AutoIncrement=true 和 AutoIncrementStep=-1。我可以从 DataGridView 在 Person DataTable 中插入记录。PersonID 列显示 PersonID 的唯一负值。我通过调用 DataAdapter.Update(PersonTable) 更新数据库,SQL Server 自动将负的 PersonID 转换为正的唯一值。
这就是问题所在。Address DataGridView 通过 PersonID 显示与 Person 有 DataRelation 的地址表。插入的人员记录具有临时负的 PersonID。我现在可以通过 DataGridView 将记录插入到 Address 中,并且 Address.PersonID 设置为 DataRelation 映射中的负值。我调用 Adapter.Update(AddressTable) 并且否定的 PersonID 进入地址表,打破了这种关系。
你们如何使用 DataTables 和主从 DataGridViews 处理主键/外键?
谢谢!史蒂夫
编辑:
经过更多的谷歌搜索,我发现 SqlDataAdapter.RowUpdated 事件给了我我需要的东西。我创建了一个新命令来查询使用@@IDENTITY 插入的最后一个id。它工作得很好。DataRelation 为我更新了 Address.PersonID 字段,因此需要先更新 Person 表,然后更新 Address 表。所有新记录都正确插入,并带有正确的 ID!
Adapter = new SqlDataAdapter(cmd);
Adapter.RowUpdated += (s, e) =>
{
if (e.StatementType != StatementType.Insert) return;
//set the id for the inserted record
SqlCommand c = e.Command.Connection.CreateCommand();
c.CommandText = "select @@IDENTITY id";
e.Row[0] = Convert.ToInt32( c.ExecuteScalar() );
};
Adapter.Fill(this);
SqlCommandBuilder sb = new SqlCommandBuilder(Adapter);
sb.GetDeleteCommand();
sb.GetUpdateCommand();
sb.GetInsertCommand();
this.Columns[0].AutoIncrement = true;
this.Columns[0].AutoIncrementSeed = -1;
this.Columns[0].AutoIncrementStep = -1;