【问题标题】:Get highest ID number in ID kolumn and increment获取 ID 列中的最高 ID 号并递增
【发布时间】:2016-01-04 13:53:51
【问题描述】:

如何从数据集中的 ID 列中获取最高 ID 号?我正在使用 ADO.NET (C#)。如果我这样做:

dataSet.Tables["Students"].Columns["ID"].AutoIncrement = true;

当我到达一个已经存在的 ID 时,应用程序将抛出异​​常。从“高数字”开始只是一个丑陋的黑客。那么如何才能正确安全地完成这项工作呢?

我在 GridView 中添加新行并将该数据保存到缓存中,然后从缓存返回到 DataSet,然后使用 DataAdapter 方法“更新”将新数据发送回 SQL Server。

【问题讨论】:

  • 我不明白这个问题。什么是“当我到达已经存在的 ID 时会抛出异常”?如果该列是 IDENTITY 列,则无需手动插入该值。插入记录时,它将由数据库分配。所以在插入之前你不会知道真实的数字。然后你可以使用SELECT SCOPE_IDENTITY() 来获取值。你可以combine the insert with this select to get this value in one statement
  • 对不起。 SQL Server 有一个带有 AutoIncrement 的 ID 主键列。但数据集没有。因此,当我向 DataSet 添加新记录时,我需要提供一个 ID。如果我只是自动增加 ID,它最终会在存在两个 ID 值时破解应用程序。假设我在 DataSet 中有 ID 值为 1、2、3、4、5 等的记录。当我向该 DataSet 添加新记录时,我需要提供新记录和 ID 值为 6,高于最高值数据集中存在的 ID 值。
  • 如果是IDENTITY-column,则无需指定 ID。您只需插入其他值:INSERT INTO Students(col2,col3,..) VALUES (@col2,@col3,...); SELECT SCOPE_IDENTITY();。该 insert.statement 可以使用 ExecuteScalar 执行,您将获得插入记录的新 ID 值。 msdn.microsoft.com/en-us/library/vstudio/… 它还应该使用新的 ID 值更新 DataTable,但我不确定。
  • 这是离线模式,断开数据访问。您正在谈论更新底层 SQL 数据库。异常来自 DataSet 而不是 SQL 数据库。

标签: sql linq gridview ado.net dataset


【解决方案1】:

这是一种方法,因为该值将从数据库中插入,因为它是 IDENTITY 列,因此您分配的值并不重要。但我会使用负值来表示该行当前未添加到数据库中。

所以增加added-rows DataTable 的负行计数值:

DataTable tblStudents = dataSet.Tables["Students"];
DataRow addedRow = tblStudents.Rows.Add();
DataTable tblAddedRows = tblStudents.GetChanges(DataRowState.Added);
addedRow.SetField("ID", -1 * tblAddedRows.Rows.Count);

// other columns...

冲突是不可能的,因为这个 ID 值只是临时的,将在插入记录后替换为实际值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2021-12-06
    • 2011-08-08
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多