唯一号码标识符生成

时间:2012-01-01 09:51:43

标签: c# .net entity-framework

我必须为数据库中的记录创建生成唯一编号标识符的逻辑。 id,在数据库中生成是一个单独的列。

此时,当用户调用“创建记录”操作时,我保存新记录,获取其数据库ID,使用此ID生成记录号,然后将其放入编辑表单。 使用这种方式意味着所有实体字段都应该是可空的,以便将记录保存到数据库中。

我不喜欢这样。我知道这应该是更好的方式。

有更好的做法来生成唯一号码标识符吗?生成非唯一随机数的可能性是什么?

谢谢

5 个答案:

答案 0 :(得分:7)

您正在使用的模式,只是为了获取ID而保存空记录,并不是一个好的模式。

标准方法和我推荐的方法是创建记录只显示一个空表格(此时的ID通常为0)。用户填写表单,数据仅在用户单击“保存”时提交到数据库。 ID应该是IDENTITY列。

您的方法存在的问题是,如果用户没有填写表单,您的数据库中会出现大量不完整的记录。当然,这使得处理数据验证和完整性变得更加困难。

如果确实必须向用户显示ID,另一种方法是使用包含“Next Record ID”列的行的单独表。此列可以递增并作为原子操作返回,并用于填充新记录的ID。您仍然不创建真实记录,只需在“创建记录”操作中增加此“下一记录ID”。使用此方法,您可以通过在“记录ID”表中为每个实体分别使用相同的行来对多个实体使用相同的方法。请记住,如果用户最终没有将记录保存到数据库,则ID仍将“用完”。这些数字仍然是唯一的,并且按时间顺序排列,但不一定是连续的。

答案 1 :(得分:1)

我不明白,但是,如果您在数据库中使用uniqueidentifier数据类型,则转换为C#中的Guid,您可以这样做:

public Guid CreateRecord(MyObject model) {

    Guid newId = Guid.NewGuid();

    MyTable tbl = new MyTable();
    tbl.guid = newId;

    // ... other columns

    db.MyTable.AddObject(tbl);
    db.SaveChanges();

    return newId;
}

虽然我通常做的是将PrimaryKey设为int并添加名为uniqueidentifier的{​​{1}}字段(我公开使用它而不是guid)并记住索引该列。

答案 2 :(得分:1)

表格代码..

CREATE TABLE TblTransactions(
    TId varchar(8),
    TName varchar(50)
)

C#代码背后......

protected void Page_Load(object sender, EventArgs e)
{
    string id = GenerateId("TblTransactions", "TId", 8, "TRN");
// insert the id along with data in the table
    Response.Write(id);
}

public string GenerateId(string TableName, string ColumnName, int ColumnLength, string Prefix)
{
    SqlConnection con = new SqlConnection("server=.;integrated security=true;database=EBissCard");
    string Query, Id;
    int PrefixLength, PadLength;
    PrefixLength = Convert.ToInt32(Prefix.Length);
    PadLength = ColumnLength - PrefixLength;
    Query = "SELECT '" + Prefix + "' + REPLACE(STR(MAX(CAST(SUBSTRING(" + ColumnName + "," + Convert.ToString(PrefixLength + 1) + "," + PadLength + ") AS INTEGER))+1," + PadLength + "),' ',0) FROM " + TableName;

    SqlCommand com = new SqlCommand(Query, con);
    con.Open();
    if (com.ExecuteScalar().ToString() == "")
    {
        Id = Prefix;
        for (int i = 1; i <= PadLength - 1; i++)
        {
            Id += "0";
        }
        Id += "1";
    }
    else
    {
        Id = Convert.ToString(com.ExecuteScalar());
    }
    con.Close();
    return Id;
}

答案 3 :(得分:0)

尝试.net本身的Random课程。

答案 4 :(得分:0)

为记录生成唯一编号的想法是使用time()(以毫秒为单位)(自参考时间点起,例如,01/01/2010)。

但是,如果有2条记录同时更新,则可能会导致问题。要解决此问题,如果可以为每个用户分配一个号码(在创建用户ID时),该“用户号码”的组合(串联)和以毫秒为单位的时间将为您提供所需的唯一号码。