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