ado.net中数据表之间的列中的共享值

时间:2009-04-21 15:01:12

标签: c# ado.net indexing datatable dataset

我正在使用c#并且我有三个数据表,三个都有一个名为idnum的int列,我需要的是保持三个表中列idnum中的所有数字唯一,下一个数字将始终是小的。例如:

表a

IDNUM = 1

IDNUM = 3

IDNUM = 4

表格b

idnum = 2

IDNUM = 7

表格c

IDNUM = 8

在这种情况下,三个表中任何一个表中新行的下一个数字将是5号,然后是6号,然后是9号。

我的问题是获得下一个号码的最佳方法是什么? 我不想使用sql。

感谢 努诺

2 个答案:

答案 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。