【问题标题】:How to calculate the (custom id) for a row which has not been inserted yet?如何计算尚未插入的行的(自定义 id)?
【发布时间】:2017-04-08 18:33:06
【问题描述】:

我正在使用这个问题的答案How to automatically generate unique id in sql server 来为表格创建一个自定义 ID。它工作得很好。
现在我有一个包含 UID00000001UID00000002 等值的列.假设此列中的最后一个值是UID00000003。现在我想在我的.aspx 页面之一中计算尚未通过C# 插入的行的值。在这种情况下UID00000004。我怎样才能实现这个价值? 任何帮助,将不胜感激。 谢谢。

【问题讨论】:

  • 是否可以在实际保存行后显示这些值?除非您在应用程序中生成标识符,否则没有人可以告诉您在使用身份或序列保存时会收到什么 ID。如果您确定只有您的应用程序在该表中执行插入操作,就会发生这种情况。
  • 你不能提前计算值,因为插入可能会失败,如果发生这种情况你会得到错误的数字,或者其他一些过程可能会在计算时间和实际时间之间插入一条记录插入。

标签: c# asp.net sql-server


【解决方案1】:

如果您不需要在数据库级别生成这些标识符(例如,其他一些进程在那里插入记录),您可以在您的应用程序中预先生成它们。类似上面的东西:

class Generator
{
     public static int UniqueId = 0;

     public static int GetNextId()
     {
          return Interlocked.Increment(ref UniqueId);
     }
}

然后,您的代码可以预先分配这些标识符并格式化这些字符串。如果多个用户访问相同的功能,他们将收到其他标识符。但是,如果没有(成功)执行保存操作,这些标识符将会丢失。

【讨论】:

  • 我不需要对这个值做任何事情。我只是出于某些显示目的需要它。无论如何,感谢您发布宝贵的时间。
【解决方案2】:

您需要执行此查询以获取将为表生成的下一个身份:

SELECT IDENT_CURRENT('table_name')+1; 

对于您的情况,它将与下一个身份连接一些其他信息,因此查询将如下所示:

SELECT 'UID' + RIGHT('00000000' + CAST(IDENT_CURRENT('table_name')+1 AS VARCHAR(8)), 8)

当然,您需要编写 C# 代码将该查询发送到 SQL Server。

话虽如此,请记住这一点:当您从该调用中获取值并持有该值时,如果在您持有该值期间将一条记录插入到该表中,则该值是 no更长下一个值。

如果您在应用程序中插入记录后需要标识值,请参考this答案。

【讨论】:

  • CodingYoshi 请阅读我提供其链接的问题的答案。此列不是自动增量列。
  • 除了我需要这个值只是为了显示目的我不会再把这个值发送到sql server。
  • @ElhamKohestani 根据该答案,它是一个自动增量列(它是标识值和其他一些字符的组合)。
  • 但其中的“ID”是自动增量,而不是“UID”。所以执行这个 SELECT IDENT_CURRENT('table_name')+1;会增加“ID”还是“UID”?
  • 好的,我试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2021-06-02
  • 2011-02-04
  • 2012-09-16
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多