【问题标题】:Auto alphanumeric Unique Id with C#使用 C# 的自动字母数字唯一 ID
【发布时间】:2019-04-07 07:33:57
【问题描述】:

字符串总长度为 5 个字符。我有一个场景,ID开头:A0001,结尾:A9999,B0001到B9999

现在,

  • 如果我的产品 (a) 将具有 A0001、A0002 等......
  • 如果我的产品 (b) 将有 b0001、b0002 等......

如何创建这种格式?

我试过了:

int a;
        using (SqlCommand command2 = new SqlCommand("select * from voiceno WHERE ID = '1'", con))
        {
            con.Close();
            con.Open();

            SqlDataReader dr;
            dr = command2.ExecuteReader();
            if (dr.Read())
            {
                string val = dr["voiceno"].ToString();
                if (val == "0")
                {
                    txtinvoiceno.Text = "00001";
                }
                else
                {
                    a = Convert.ToInt32(dr["voiceno"].ToString());         
                    a = a + 1;
                    txtinvoiceno.Text = a.ToString("00000");
                }
            }

        }

我的桌子看起来像

CREATE TABLE [dbo].[voiceno](
[ID] [int] IDENTITY(1,1) NOT NULL,
[voiceno] [nvarchar](50) NULL)

【问题讨论】:

  • 那么,您是否最多有 26 行,或者您会继续拥有 AA0001、AB0001 等吗?听起来您可以将行 nr 添加到 ascii (65) 中 A 的 int 中,然后将输出转换为 char
  • 不,我没有最大的@Icepickle 你能解释一下如何做到这一点
  • 您想在数据库中保存字母数字键,例如 A00001... 或者您只想显示 A00001 但实际上在数据库中它是 00001 ?如果是,那么用钥匙显示“A”或“B”的检查是什么。
  • 但是如果你的第一个产品是 A 而你的第二个产品是 B,那么这意味着它会一直运行到 Z,这将是 26 行,这 26 行之后发生的事情可能会很有趣
  • 您的代码中的某些内容似乎不太正确。您阅读表 voiceno 并获得 voiceno 的值,然后将这个值加 1 并显示它。这是一种查找表中存在的最大值并将其递增以插入新记录的方法吗?

标签: c# alphanumeric


【解决方案1】:

您可以拥有一个获取当前值并为您提供下一个值的函数:

public string Next(string cur)
{
    int num = int.Parse(cur.Substring(1));
    char chr = cur[0];
    num++;
    if (num > 9999)
    {
        num = 0;
        chr++;
    }
    return chr + num.ToString().PadLeft(4, '0');
}

让它从数据库中获取最后一个:

您可以从数据库中获取当前最大的 ID,例如:

select Max(id) from voiceno

也看 Custom Auto-Generated Sequences with SQL Server

Live Demo

【讨论】:

  • 我不明白,你说的 (Zian,Jon) 是什么意思
  • @ahmed_eltot93 这个解决方案没有将密钥保存到数据库中,但你说你想像这样将它们保存在数据库中......请清楚准确地回答你的问题,你的问题非常模棱两可跨度>
  • @ZainArshad 是的,我明白了,现在我没有尝试并询问下边我只看到了什么,我和你在一起
  • 当使用这种方法时,如何确保两个项目不会尝试写回相同的值?如果线程 A 返回当前最大值为 456,并且在它写回新值(假定为 457)之前,线程 B 也返回 456? PS:如果您检查链接的问题,您会发现全部责任都转移到了数据库以防止这种情况发生。
  • @MartinVenter 如果我想为 Zain 创建一个新发票,它将类似于 Zain0001 如果是 VIVA,它将类似于 VIVA0002、VIVA0003 等......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多