保存记录后获取自动生成的memberId问题及代码调试求助
解决自动编号字段
memberId保存后无法获取正确值的问题 你遇到的问题核心是:新增记录时memberId在保存前为-1,保存后需要获取实际值关联其他表,但全表重新加载后BindingSource定位到了第一条记录,无法拿到刚新增的ID。
正确解决方案
不需要重新Fill整个数据表,利用TableAdapter的特性,在Update后直接刷新新增行的自增字段值即可:
this.membersBindingSource.EndEdit(); // 获取新增的行 var addedRows = this.ContactsDataSet.Members.GetChanges(DataRowState.Added); // 只更新新增的行(比全表Update更高效) this.membersTableAdapter.Update(addedRows); // 接受更改,刷新行的字段值 this.ContactsDataSet.Members.AcceptChanges(); // 直接从新增行获取实际的memberId var newMemberRow = (MembersRow)addedRows.Rows[0]; int newMemberId = newMemberRow.MemberId; // 如需在BindingSource中定位到新增记录 this.membersBindingSource.Position = this.membersBindingSource.Find("MemberId", newMemberId);
关键说明
- 避免全表Fill:原代码中
membersTableAdapter.Fill()会重置整个数据集,导致BindingSource的Current回到第一条记录,这就是你拿到错误ID的原因。 - 配置InsertCommand返回自增ID:确保你的TableAdapter的InsertCommand包含返回自增ID的逻辑:
- SQL Server:在Insert语句后追加
SELECT MemberId FROM Members WHERE MemberId = SCOPE_IDENTITY(); - MySQL:追加
SELECT 49227 AS MemberId;
强类型DataSet的TableAdapter通常会自动配置这个逻辑,若没有则需手动修改。
- SQL Server:在Insert语句后追加
内容的提问来源于stack exchange,提问作者JRoss
相关产品推荐
相关产品推荐

