Вы не сможете сделать это автоматически; функции автоматической нумерации, встроенные в ADO.NET, привязаны к отдельной таблице.
Итак, учитывая, что вам нужно будет написать свой собственный метод, чтобы справиться с этим, что лучше?
Если вы использовали базу данных, я предлагаю вам использовать четвертую таблицу, сделайте столбец идентификатора в трех основных таблицах внешним ключом, в котором вы сохранили идентификатор четвертой таблицы, и синхронизируйте вставку строки в четвертая таблица с вставкой строки в любую из трех других. Что-то вроде:
INSERT INTO Sequence (DateInserted) VALUES (GETDATE())
INSERT INTO TableA (SequenceID, ...) VALUES (@@SCOPE_IDENTITY(), ...)
Но вы не хотите использовать базу данных, которая предлагает мне, что вы на самом деле не волнует сохранение этих идентификационных номеров.Если они действительно только должны существовать в то время как ваше приложение работает, вы можете просто использовать статическое поле, чтобы сохранить последний использовавшийся 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()
или ее добавляется новая строка через элемент управления с привязкой к данным - каждая добавленная строка будет иметь свой столбец идентификаторов для следующего идентификатора.