如何使用设计器生成的DataTable手动设置AUTOINCREMENT列的ID?

时间:2016-09-15 22:02:34

标签: c# ms-access ado.net

我正在用C#为库系统创建一个数据库系统(使用Access数据库),而且我遇到了一堵砖墙。我有一个名为“BSUser”的表,它有一个主键的自动增量列,“UserID”;如果用户在定义新用户时没有输入值,我希望自动生成此值,但我也希望它能够接受手动定义的值。根据用户输入的信息,我使用以下代码创建新行。请注意检查用户ID是否为空...

BookshelfDataSet.BSUserRow user = dataSet.BSUser.NewBSUserRow();
if (userID != null) user.UserID = userID.Value;
user.Forename = forename;
user.Surname = surname;
user.IsAdmin = isAdmin;
dataSet.BSUser.AddBSUserRow(user);
SaveDataSetToDatabase();

这是应该更新数据库的代码......

private void SaveDataSetToDatabase()
{
    this.bookTableAdapter.Update(this.dataSet);
    this.copyTableAdapter.Update(this.dataSet);
    this.userTableAdapter.Update(this.dataSet);
    this.loanTableAdapter.Update(this.dataSet);
    this.ratingTableAdapter.Update(this.dataSet);
}

该行已成功保存到数据库,但尽管我手动设置了该ID,但仍会自动生成其ID。这是一个问题,因为库的现有用户已经拥有旧系统的ID,所以我需要将这些ID带到新系统中。请有人告诉我我做错了什么以及如何解决问题?

2 个答案:

答案 0 :(得分:2)

对于使用Access 2010或更高版本的用户,可以使用Before Change数据宏来实现所需的结果。对于名为[BSUser]的示例表:

[UserID] - 长整数,主键
[ExistingID] - 长整数
[Forename] - 文字(100)
[姓] - 文字(100)

和之前更改数据宏

BeforeChange.png

如果我们包含[ExistingID]值,那么它将被用作[UserID]主键(假设它不存在于表中)

var ta = new Database1DataSetTableAdapters.BSUserTableAdapter();
ta.Insert(null, 3, "Gord", "Thompson");  // insert with ExistingID = 3

导致

UserID  ExistingID  Forename  Surname    
------  ----------  --------  -----------
     3           3  Gord      Thompson   

如果我们不包含[ExistingID]值,则宏将为我们分配一个

var ta = new Database1DataSetTableAdapters.BSUserTableAdapter();
ta.Insert(null, null, "Nora", "Newuser");  // insert with ExistingID = null

喜欢这样

UserID  ExistingID  Forename  Surname    
------  ----------  --------  -----------
     3           3  Gord      Thompson   
  1000              Nora      Newuser

答案 1 :(得分:0)

您必须使用自动递增值,或自行设置。没有选择同时做到这两点。