我必须为数据库中的记录创建生成唯一编号标识符的逻辑。 id,在数据库中生成是一个单独的列。
此时,当用户调用“创建记录”操作时,我保存新记录,获取其数据库ID,使用此ID生成记录号,然后将其放入编辑表单。 使用这种方式意味着所有实体字段都应该是可空的,以便将记录保存到数据库中。
我不喜欢这样。我知道这应该是更好的方式。
有更好的做法来生成唯一号码标识符吗?生成非唯一随机数的可能性是什么?
谢谢
答案 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时),该“用户号码”的组合(串联)和以毫秒为单位的时间将为您提供所需的唯一号码。