У меня есть приложение, которое добавляет домашних животных в базу данных SQL.
В настоящее время пользователь должен знать, какие PetID существуют, и поэтому должен знать, что доступно для добавления. Если пользователь пытается ввести уже существующий идентификатор, программа выдает ошибку.
Я думаю, мне нужно, чтобы значение PetID (верхнее текстовое поле) автоматически определялось при загрузке страницы, со значением, которое не будет конфликтовать с уже существующим значением...
Может кто-нибудь помочь? я понятия не имею, как это сделать
Мне нужна page_load для автоматического поиска в базе данных SQL доступных идентификаторов PetID, выбора одной из них с наименьшим значением и автоматической установки ее в текстовое поле (так что пользователю не придется беспокоиться о выборе той, которая не ' т уже занят)...
Как я могу иметь идентификатор, который доступен, ожидая в верхнем текстовом поле, после загрузки страницы? также сделайте так, чтобы пользователь не мог попытаться изменить это.
Вы можете создать PetId как столбец идентификаторов, как показано ниже:
[PetId] [int] IDENTITY(10,1) NOT NULL
Таким образом, вам не нужно будет добавлять его вручную, каждый раз, когда вы добавляете запись Pet, PetId будет сгенерирован автоматически, и это будет уникальным. Таким образом, столкновение PetId не произойдет.
Здесь 10 представляет первый номер Id, а 1 представляет, как будут увеличиваться ваши PetIds.
С уважением, Пратик
Одним из вариантов будет использование последовательности:
CREATE SEQUENCE pet_id_seq START WITH 7
Я начинаю с 7, потому что это первый доступный pet_id
Затем при загрузке страницы получите следующее значение для последовательности, выполнив следующий запрос:
SELECT (NEXT VALUE FOR pet_id_seq) AS next_pet_id
И покажите значение, возвращаемое запросом, в текстовом поле pet_id.
У этого подхода есть один недостаток, он создает пробелы, если вы открываете страницу, но на самом деле вы не вставляете строку питомца, идентификатор теряется навсегда. Но я думаю, что вам все равно, чисел много, вы их не исчерпаете.
Другой вариант - использовать следующий запрос для заполнения текстового поля pet_id:
SELECT MAX(pet_id) + 1 AS next_pet_id FROM pets
Но у этого есть еще один недостаток. Это не работает хорошо в параллельных сценариях. Если два пользователя одновременно открывают страницу создания питомца, они получают один и тот же next_pet_id, и один из них получит ошибку нарушения первичного ключа.
Обычно вы вводите свои данные и возвращаете идентификатор после добавления записи в базу данных (используя вставку Id
столбце Id
).
Если вы хотите, чтобы следующий номер отображался ДО создания данных, используйте целочисленный столбец для ID
без параметра Вставка идентификатора и создайте последовательность SQL Server. Создайте хранимую процедуру, чтобы вернуть следующий порядковый номер для отображения на странице создания.
Установите для столбца id автоматическое увеличение и не позволяйте пользователю вставлять его, пусть база данных решит это для себя. Или вы можете изменить тип столбца id и использовать Guid.NewGuid()
для создания нового идентификатора.
Добавьте событие TextChanged, которое проверяет существующие значения и сообщает пользователю, доступен ли введенный PetID или нет.