You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

保存记录后获取自动生成的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);

关键说明

  1. 避免全表Fill:原代码中membersTableAdapter.Fill()会重置整个数据集,导致BindingSource的Current回到第一条记录,这就是你拿到错误ID的原因。
  2. 配置InsertCommand返回自增ID:确保你的TableAdapter的InsertCommand包含返回自增ID的逻辑:
    • SQL Server:在Insert语句后追加SELECT MemberId FROM Members WHERE MemberId = SCOPE_IDENTITY();
    • MySQL:追加SELECT 49227 AS MemberId;
      强类型DataSet的TableAdapter通常会自动配置这个逻辑,若没有则需手动修改。

内容的提问来源于stack exchange,提问作者JRoss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:18:21