/**************************获得序列号格式:XXX0000XXXXX 如:LHY0000123456*************************/
/***************************注:此处ID范围为0~4294967295********************************************/
void __fastcall GetSerialnumber(char *dest,char *code,int codelen,unsigned int ID)
{
char *pDest=new char[codelen+10];
memset(pDest,0,codelen+10);
memcpy(pDest,code,codelen);
for(int i=codelen;i<codelen+10;++i)
{
pDest[i]+='0';
}
char sz[11]="";
itoa(ID,sz,10);
int len=lstrlenA(sz);
memcpy(pDest+(codelen+10-len),sz,len);
memcpy(dest,pDest,lstrlenA(pDest)+1);
delete [] pDest;
}
//调用示例:
char serialnum[100]="";
char *code="LHY";
unsigned int ID=123;//可以是自动递增数
GetSerialnumber(serialnum,code,lstrlenA(sz),ID);
多个客户端同时操作数据库(如:新增用户编号)时需要保证生成编号不重复,下面是一个可支持并发操作的SQL Server存储过程
CREATE PROCEDURE GenerateID
@Code varchar(20),
@ID varchar(50) output
AS
/*启用事务控制并发编号不重复*/
BEGIN TRANSACTION
declare @maxid int
set @maxid=0
select *from 会员信息表
if @@rowcount>0
begin
declare @max varchar(50)
select @max=max(会员编号) from 会员信息表
select @maxid=right(@max,9)
end
set @maxid=@maxid+1
declare @j int
set @j=9-len(@maxid)
declare @i int
set @i=0
set @ID=@Code
while @i<@j
begin
set @ID=@ID+'0';
set @i=@i+1;
end
set @ID=@ID+convert(varchar(20),@maxid)
insert into 会员信息表(会员编号) values(@ID)
COMMIT
GO