Общие значения в столбце между таблицами данных в ado.net - PullRequest
0 голосов
/ 21 апреля 2009

Я использую c # и у меня есть три таблицы данных, у всех трех есть столбец int с именем idnum, мне нужно, чтобы все числа в столбце idnum были уникальными в трех таблицах, и следующее число всегда будет доступно , Например:

Таблица

idnum = 1

idnum = 3

idnum = 4

таблица b

idnum = 2

idnum = 7

стол с

idnum = 8

в этом случае следующим числом в новой строке в любой из трех таблиц будет число 5, затем 6, а затем 9.

Мой вопрос: как лучше всего получить следующий номер? Я не хочу использовать sql.

спасибо нуно

Ответы [ 2 ]

1 голос
/ 21 апреля 2009

Вы, вероятно, захотите четвертую таблицу, в которой будут храниться все числа «пробелов». В противном случае вам придется проверять каждый номер, начиная с 1.

При вставке: найдите наименьшее число в таблице «пробелы». Используйте этот номер при вставке нового элемента. Если в таблице промежутков нет элементов, используйте Max + 1 идентификаторов во всех таблицах.

При удалении: поместите номер, который вы только что удалили, в таблицу "пробелов".

Если ваше приложение является многопоточным, вам нужно добавить блокировку, чтобы убедиться, что два потока не захватывают один и тот же разрыв.

0 голосов
/ 21 апреля 2009

Вы не сможете сделать это автоматически; Все функции автоматической нумерации, встроенные в 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(), или новая строка, добавляемая через элемент управления с привязкой к данным - для каждой добавленной строки в столбце идентификатора будет установлен следующий идентификатор .

...