我正在使用c#并且我有三个数据表,三个都有一个名为idnum的int列,我需要的是保持三个表中列idnum中的所有数字唯一,下一个数字将始终是小的。例如:
表a
IDNUM = 1
IDNUM = 3
IDNUM = 4
表格b
idnum = 2
IDNUM = 7
表格c
IDNUM = 8
在这种情况下,三个表中任何一个表中新行的下一个数字将是5号,然后是6号,然后是9号。
我的问题是获得下一个号码的最佳方法是什么? 我不想使用sql。
感谢 努诺
答案 0 :(得分:1)
你可能想要第四张表来保存所有“差距”数字。否则你必须检查从1开始的每个数字。
在插入时:在“间隙”表中找到最小的数字。插入新项目时使用该编号。如果间隙表中没有项目,请在所有表格中使用Max + 1个idnums。
开启删除:将您刚退休的号码放入“空白”表格。
如果您的应用是多线程的,则必须添加锁定以确保两个线程不会占用相同的间隙。
答案 1 :(得分:0)
你无法自动执行此操作; ADO.NET中内置的自动编号功能都限定在单个表中。
所以,鉴于你将不得不编写自己的方法来处理这个问题,那么最好的方法是什么?
如果您使用的是数据库,我建议您使用第四个表,将三个主表中的ID列作为存储第四个表的ID的外键,并同步插入第四个表的行将一行插入其他三个表中的表。类似的东西:
INSERT INTO Sequence (DateInserted) VALUES (GETDATE())
INSERT INTO TableA (SequenceID, ... ) VALUES (@@SCOPE_IDENTITY(), ...)
但是你不想使用数据库,这表明你并不真正关心这些ID号的持久性。如果它们确实只需要在应用程序运行时存在,那么您可以使用静态字段来存储上次使用的ID,并创建一个帮助类:
public static class SequenceHelper
{
private static int ID;
private static object LockObject = new object();
public static int GetNextID()
{
lock (LockObject)
{
return ID++;
}
}
}
锁定并不是绝对必要的,但使这段代码的线程安全无害。
然后,您可以在三个数据表中的每一个上处理TableNewRow
事件,例如:
DataTable t = MyDataSet["TableA"];
t.TableNewRow += new delegate(object sender, DataTableNewRowEventArgs e)
{
r.Row["ID"] = SequenceHelper.GetNextID();
};
这将确保无论何种方法向每个表添加新行 - 无论是您的代码调用NewRow()
还是通过数据绑定控件添加新行 - 添加的每一行都将其ID列设置为下一个ID。