Рассмотрите возможность создания ограничения в таблице базы данных ( уникальное ограничение для этого столбца (столбцов)). Это предотвратит сохранение любых дублирующихся записей, даже если он передает ваш код C #, который обращается к базе данных.
Добавьте проверку, чтобы увидеть, существует ли запись , непосредственно перед выполнением оператора INSERT
. Вы можете написать оператор SQL, который проверяет перед шагом вставки. Может быть хранимой процедурой, в которой есть сценарии SQL, которая делает это, и вы можете вызвать хранимую процедуру из вашего метода c #.
Нет смысла возвращать ответ перенаправления, если вы вызываете его из кода Ajax. Подумайте о возвращении структуры JSON, которая может сообщить клиентскому коду, была ли запись успешно вставлена, найден ли дубликат или произошел сбой кода.
Вот быстрый и простой пример, где я вызываю метод UserExist
, который проверяет, есть ли запись с указанным именем. Если он возвращает false
, я продолжаю выполнять свой код, куда я попытаюсь вставить. Если вы используете хранимую процедуру, вы можете добавить в нее проверку наличия записи.
[HttpPost]
public ActionResult AddUser(int id, string name, string age)
{
try
{
// your existing code to insert record to db
// Check record exist
if(UserExist(name))
{
return Json(new { status="failed", message = "Name exist"});
}
// name does not exist. Try to call the Insert code now.
return Json(new { status="success", message = "Successfully saved"});
}
catch (SqlException exs)
{
// Check exs to see whether this was caused by unique constraint violation
return Json(new { status="error", message = "User exist"});
}
catch (Exception ex)
{
// to do : log the exception
return Json(new { status="error", message = "Error in saving"});
}
}
private bool UserExist(string name)
{
// to do: check record exist in db
// You may use ExecuteScalar method if you use raw ADO.NET
// to do : return boolean value.
}
и в обработчике success
проверьте свойство status
ответа json и покажите пользователю соответствующее сообщение
success:function(data)
{
if(data.status==="success")
{
alert("Saved successfully");
}
else if(data.status==="failed")
{
alert(data.message);
}
}
Вы можете установить свойство status
вашего объекта JSON на failed
, когда вы пытаетесь вставить дублирующую запись.
Вы можете использовать определенные исключения для вашей части обработки исключений, которая может перехватить исключение, когда ограничение уникального ключа нарушено на уровне базы данных. Также отправьте сообщение пользователю в этом блоке перехвата.