具有唯一ID的逻辑错误

时间:2018-05-19 09:13:38

标签: c# sql-server

我有一个生成唯一ID的应用程序。每次用户请求新ID时,都应该将ID增加值1。当表格为空时,请求生成的ID为GPSC0000001。插入后,下一个ID应为GPSC0000002,依此类推。生成的第一个ID工作正常,我得到ID GPSC0000001,但第二个请求给我一个ID GPSC610000000而不是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();
    }

2 个答案:

答案 0 :(得分:1)

如果这是多个用户同时使用的应用程序,它可能会生成重复的ID。 因此,我建议使用标识列和计算列在数据库中创建值以避免此前景。

这是一个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

修改 您根本不需要计算列,只需在代码中添加前缀到Id列。

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

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

答案 1 :(得分:0)

我认为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;