C# 具有唯一ID的逻辑错误

C# 具有唯一ID的逻辑错误,c#,sql-server,C#,Sql Server,我有一个生成唯一ID的应用程序。每次用户请求一个新ID时,应该将ID的值增加1。当表在请求时为空时,生成的ID将是GPSC0000001。插入后,下一个ID应为GPSC0000002,依此类推。生成的第一个ID工作正常,我得到ID GPSC0000001,但第二个请求给我的ID是GPSC61000000,而不是GPSC0000002 private void btnid_Click(object sender, EventArgs e) { string GetC

我有一个生成唯一ID的应用程序。每次用户请求一个新ID时,应该将ID的值增加1。当表在请求时为空时,生成的ID将是GPSC0000001。插入后,下一个ID应为GPSC0000002,依此类推。生成的第一个ID工作正常,我得到ID GPSC0000001,但第二个请求给我的ID是GPSC61000000,而不是GPSC0000002

   private void btnid_Click(object sender, EventArgs e)
    {

        string GetCode = "0";
        cn.Open();
        cmd = new SqlCommand("select * from jimmy order by Id desc",cn);
        try
        {
            dr = cmd.ExecuteReader(CommandBehavior.SingleRow);
            if (dr.Read())
                GetCode = dr["Id"].ToString();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        if (string.Equals(GetCode, "0"))
            lblID.Text = "GPSC0000001";
        else
        {
            int TotalCodeWithoutLable = GetCode.Length - 6;
            int OldNum = GetCode.Length - TotalCodeWithoutLable;
            lblID.Text = "GPSC" + OldNum + 1 +  "0000000";
        }
        cn.Close();
    }

我认为OldNum的计算是错误的:

int OldNum = GetCode.Length - TotalCodeWithoutLable;
上面的意思是取GPSC0000001的长度,即11,并将其减少5 12-6,这是在前一行中计算的。然后连接字符串GPSC、6、1和0000000

与此相反,您应该从GPSC0000001获取数值,并在向其添加1时将其作为数字处理。大概是这样的:

int oldNum = Int32.Parse( GetCode.Substring( 4, 7 ) ) + 1;
lblID.Text = "GPSC" + oldNum;

如果这个应用程序被多个用户同时使用,它可能会生成重复的ID。 因此,我建议使用identity列和computed列在数据库中创建值,以避免出现这种情况

下面是一个SQL代码片段,它将为您创建此代码

CREATE TABLE [dbo].[jimmy](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ComputedId]  AS ('GPSC'+replace(str([Id],(7)),space((1)),'0')),
 CONSTRAINT [PK_jimmy] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
编辑 您实际上并不需要computed列,如果愿意,您可以在代码中向Id列添加前缀

要从数据库中获取值,可以在存储过程中创建一个insert语句,返回计算值

create procedure sp_jimmy as
begin
insert into jimmy default values
select 'GPSC'+replace(str(@@IDENTITY,(7)),space((1)),'0')
end

你的错误的一部分,你有没有想过如果两个用户同时调用这个代码会发生什么?@Steve谢谢你的输入,我对编程基本上是新手。这是我第一次尝试桌面应用程序。我该怎么做?我尝试放置int I=Convert.ToInt32GetCode;就在int OldNum=GetCode.Length-TotalCodeWithoutLable之前;但这不起作用在执行该语句后i的值是多少?之后我得到了一个错误:输入字符串的格式不正确。在int i=Convert.ToInt32GetCode行上;你能试试我写的那句话吗?子字符串很重要,请切掉非数字字符。很高兴我能提供帮助: