我有一个生成唯一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();
}
答案 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;