为提交ID生成唯一的随机数

时间:2017-03-20 12:34:42

标签: c# asp.net asp.net-mvc

我有一个申请表,对于每个表单提交,我想生成一个随机Id(在0000001和1000000之间,之前没有用过同一个表(生成后要检查)。有很多例子但是我需要生成一个随机的唯一ID,并检查它是否曾被使用过。想知道在ASP.NET MVC中这样做吗?

4 个答案:

答案 0 :(得分:1)

我在我们的项目中使用了它。

DECLARE @RandNum INT;
DECLARE @Upper INT ;
DECLARE @Lower INT ;
SET @Lower = 100000
-- The lowest random number
SET @Upper = 999999
-- The highest random number


GENERATE_OTP:
SET @RandNum = @Lower + CONVERT(INT, ( @Upper - @Lower + 1 ) * RAND(CAST(NEWID() AS VARBINARY)))


IF EXISTS( SELECT 'x' FROM Yourtable WHERE RandNum = @RandNum )
GOTO GENERATE_RandNum;

SELECT @RandNum

答案 1 :(得分:1)

我会这样走(或多或少像卡拉所说,但我试图实施一个例子)。这样您就可以使用所选的数字。正如@Chris在Carra's answer中提到的,您应该考虑使用锁定(此处未显示):

-- This would be the table where you use the generated IDs:
create table used_values (id int primary key);
insert used_values values(1), (2), (5), (9), (11), (16), (17);

-- by the way of example, suppose I want to generate a random number which is   
-- bound between 1 and 20. 

-- Initially populate a table of all numbers between 1 and 20. 

例如,使用this approach生成numbers表:

create table numbers(number int);

insert numbers (number)
-- In your situation use 100000 in place of 20.
select top 20 row_number() over (order by t1.number) as N 
from master..spt_values t1 cross join master..spt_values t2;


-- how many "slots" are free?
declare @free int, @random int;
select @free = 20 - count(*) from used_values;

-- pick a random integer between 1 and @free

这可以在this answer中完成:

select @random = rand()*@howmany + 1;

-- find the "free slot" corresponding to the random number:

select number from (
select rownum = row_number() over(order by id), a.number
from numbers a left join used_values b on a.number = b.id
where b.id is null
) x where x.rownum = @random;

答案 2 :(得分:0)

  • 将1-1000000中的所有数字放入数组
  • 删除您已选择的所有号码
  • 从0开始选择随机索引> MAX(阵列)-1
  • 该职位的价值是您唯一的新身份。

答案 3 :(得分:0)

非常感谢所有试图帮助并投票给他们的人...最后我在MVC中使用了以下方法:

//Generate randon number for Submission Id
int n = 0;
Boolean check = true;                                     
//check if exist
do {
    Random r = new Random();
    n = r.Next();
    string query = "SELECT CASE WHEN EXISTS(SELECT * FROM [SubmitTable] WHERE 
[SubmitNo] = " + n + ") THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END";
    check = db.Database.SqlQuery<Boolean>(query).FirstOrDefault();
}
while (check);
model.SubmitNo = n;