创建一个不会在SQL数据上重复的随机ID

时间:2017-07-30 09:32:37

标签: c# sql-server database winforms visual-studio-2013

我有一个注册表单,但重复了自动生成的id,导致数据库表出错。每次加载regForm时,如何使其唯一?

我不知道这是否是正确的代码。

编辑:我希望随机数只是数字,因为如果我使用GUID它会给我36个字符

我希望ID是随机的,因为它是我的sql数据的主键

private void regform_Load(object sender, EventArgs e)
{
    txBNo.Text = "09XXXXXXXXX";

    connect.Open();

    SqlCommand cmd = new SqlCommand("SELECT userid FROM tblLogin", connect);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    System.Data.SqlClient.SqlDataReader dr = null;
    dr = cmd.ExecuteReader();

    Random rnd = new Random();
    int rndNum = rnd.Next(0, 10);
    txBID.Text = "EA-2017-" + rndNum.ToString();

    if (dr.Read())
    {
        if (txBID.Text == dr["userid"].ToString())
        {
            Random rnd1 = new Random();
            int rndNum1 = rnd1.Next(0, 10);
            txBID.Text = "EA-2017-" + rndNum1.ToString();
        }
    }
}

非常感谢任何类型的回复。提前谢谢。

3 个答案:

答案 0 :(得分:3)

虽然这并不能完全回答你想要的东西,但我不相信你想要的是一个好主意或可能。拥有4位数字的真正唯一数字是不可能的,并且当多个用户正在做某事时,使用DateTime变体会导致问题。

我建议您使用IDENTITY列,然后为您的唯一代码添加另一列。像user_code之类的东西。这将允许您生成用户代码(以识别用户),但是当您与数据库交互时,让IDENTITY列处理主键,这样您就不必弄乱它。

您可以使用IDENTITY列值更新表格日期,但如果您想向用户展示user_code,则可以执行此操作。如果您的要求发生变化,它还允许您更改此用户代码(例如,如果您需要将前缀从EA更改为EYUP)。

答案 1 :(得分:2)

OP,标识符中仅有四位数的变化,因此无法选择与执行相同活动的其他用户发生冲突的风险相当低的随机数。

相反,处理这种情况的典型方法是在加载表单时生成标识符,而不是在保存记录时使用identity column生成标识符。然后,您将在显示的确认页面上显示该ID,以告知用户输入记录并保存完成的过程。

答案 2 :(得分:0)

您可以尝试在几秒钟内插入datetime以使其成为身份,如下所示:

txBID.Text = "EA-" + DateTime.Now.ToString("yyyy-hhmmss");

或者,您可以用来生成新的GUID,如下所示:Refer here

txBID.Text = "EA-2017-" + Guid.NewGuid().ToString();