【问题标题】:How can I manually set an ID for an AUTOINCREMENT column using a designer-generated DataTable?如何使用设计器生成的 DataTable 手动设置 AUTOINCREMENT 列的 ID?
【发布时间】:2016-09-15 22:02:33
【问题描述】:

我正在用 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 和条形码。
  • 在表上创建一个新的主键,它是一个 GUID 或字符串或自动增量。在旧的 Pkey 字段上创建一个索引,您将拥有两全其美,每行的绝对唯一 ID 和项目的唯一 ID。

标签: c# ms-access ado.net


【解决方案1】:

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

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

和更改前数据宏

如果我们包含一个 [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

【讨论】:

    【解决方案2】:

    您必须使用自动递增值,或自行设置。两者都没有选择。

    【讨论】:

    • 这有点糟糕;如果我手动实现数据库代码(即不使用数据集),我可以两全其美(一个可以手动指定键的自动增量列)。我想这是使用设计师生成的代码而不是手工制作的代码的缺点之一!
    • ( cc: @Lee.J.Baxter ) re: “没有办法两者都做。” - 不是真的,因为 (1) Access 数据库引擎允许在添加新行时在 AutoNumber 列中插入任意值,并且 (2) 可以使用事件驱动的数据宏代替 AutoNumber 字段(有关详细信息,请参阅my answer)。
    • @GordThompson - 我不知道 Access 2010 中有此功能。感谢您提供信息! Lee J. Baxter,这看起来像是要走的路。
    • 不幸的是我没有访问权限,所以我最终手工编写了代码来手动驱动数据库(包括在添加新用户时提供可选的用户 ID)。谢谢你的信息;我将不得不在未来的项目中涉足这个! :-)
    • -1 如果要使用显式值,则在插入语句中包含自动编号列,否则在插入语句中省略自动编号列并让引擎自动生成值。这是简单的 SQL,不需要“更改前数据宏”thingamajig。
    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-08-22
    • 2013-12-10
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多