2009-04-21 3 views
0

Я использую C#, и у меня есть три datatables, все три имеют столбец int с именем idnum, мне нужно, чтобы все числа в столбце idnum были уникальными в трех таблицах и следующий номер всегда будет небольшим. Например:Общие значения в столбце между datatables в ado.net

Таблица A

idnum = 1

idnum = 3

idnum = 4

Таблица B

idnum = 2

idnum = 7

таблица с

idnum = 8

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

Мой вопрос в том, что было бы лучшим aproach, чтобы получить следующий номер? Я не хочу использовать sql.

благодаря Nuno

ответ

1

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

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

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

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

0

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

Смежные вопросы