您将无法自动执行此操作; 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 .