Как сделать так, чтобы одинаковые имена не добавлялись в таблицу бд

214
09 мая 2018, 02:00

У меня есть база (Номера автомобилей) и я хочу чтобы при добавлении уже существующего номера выходила ошибка, а не добавлялось в таблицу.

Answer 1

Вариантов два:

  • проверка в клиентском коде
  • использование ограничений на стороне сервера

Реализация на клиенте – возможный вариант, но зачем писать какой-то код, если можно не писать и проверять на сервере? )

Я рекомендую поставить ограничение на стороне сервера.

Для этого в SQL-движках предусмотрен механизм constraint (ограничений).

Вы не пишете, какая конкретно у вас БД - допустим, это MS SQL Server, как наиболее типичный выбор для .net стека.

В SQL Server unique constraint реализуются созданием unique index.

Answer 2

Проверка на стороне сервера:

 ALTER TABLE YourTable
 ADD CONSTRAINT UC_ConstraintName UNIQUE (ColumnName);
Answer 3

Вообще, хотелось бы понимать, чем вы пользуетесь, в качестве контекста БД в коде.

Как вариант, можете воспользоваться, LinqToSQL:

string connectionString = @"ваша строка подключения";
DataContext db = new DataContext(connectionString);
// не обязательно bool, здесь может быть, например, и выброс исключения...
public bool IsExist(string carNumber) 
{
    // не бывает автомобиля без номера (если не притягивать за уши, конечно)
    var car = (from car in db.GetTable<Cars>()
                    where car.LicensePlate == carNumber // licensePlate - номер авто
                    select car).FirstOrDefault();
    if (car == null)
    {
        return false; 
    }
    return true;
}

Или написав параметризированный SQL-запрос на проверку:

using (var command = new SqlCommand())
{
    command.Connection = new SqlConnection("ваша строка подключения");
    command.CommandText = "select LicencePlate from dbo.Cars where dbo.Cars.LicencePlate = @MyPlate";
    command.Parameters.AddWithValue("@MyPlate", "а777аа"); // пример
    var reader = command.ExecuteReader(); 
  // а далее читаете из ридера данные. Если похожих номеров нет, то ридер  вернет null(емнип).
  // Ну и в зависимости от результата уже можно делать инсерт в базу (или нет)
 }

UPD. Если Вам необходимо вносить сразу большое количество номеров в БД, то вам действительно нужно посмотреть в сторону SQL Server unique constraint, как верно указал @A K. Это удобнее делать на стороне БД.

READ ALSO
Как ждать завершения фоновых потоков c# Thread

Как ждать завершения фоновых потоков c# Thread

Нужно высчитать кол-во букв в строкеЗапускаю несколько потоков которые синхронно считают в заданных местах

214
Как средствами C# отправлять сообщения разным ботам в TELEGRAM?

Как средствами C# отправлять сообщения разным ботам в TELEGRAM?

Как средствами C# отправлять сообщения разным ботам в TELEGRAM? Именно ботам так как отправлять сообщение юзерам или группам у меня получилось...

214
Автоматически развернуть detils в master/details моде

Автоматически развернуть detils в master/details моде

У меня есть таблица gridControl с двумя gridView соединенных паттерном master/details одним отношением (RelationsCount = 1)

253
C# Unity Input Fields

C# Unity Input Fields

В классе class_1 Есть несколько массивов класса InputField, которым я присвоил значения путём перетаскивания в UnityСоздаю два экземпляра классов class_2...

224