ASP.NET MVC проверяет запрос от контроллера к ajax - PullRequest
0 голосов
/ 07 ноября 2018

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

Итак, сейчас я использовал try-catch для обработки дублирующейся записи. Мне просто интересно, смогу ли я вернуть какой-нибудь текст. Если значение перехватит, то отобразить его в виде предупреждения или что-то в этом роде.

Вот мой запрос от контроллера:

 public ActionResult AddUser(int id, string name, string age)
 {
        string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;

        using (MySqlConnection con = new MySqlConnection(constr))
        {
            string sqlQuery = "INSERT INTO myTable (id, name, age) VALUES (@id, @name, @age)";
            MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@name", name);
            cmd.Parameters.AddWithValue("@age", age);

            con.Open();

            try {
                cmd.ExecuteNonQuery();
                con.Close();
                return RedirectToAction("Index");
            }
            catch (Exception )
            {
                con.Close();
                return this.Json("This Data already exist on table");
            }
        }
    }

И это мой скрипт для чтения моего запроса контроллера:

 function add(id, name, age) {

        var result = confirm("Are you want to add " + name + " to list?");
        if (result == true) {

            $.ajax({
                url: '/Home/AddUser',
                type: 'POST',
                data: {
                    'id': id,
                    'name': name,
                    'age': age,
                },
                success: function (data) {                                                    
                    alert('Data has been successfully added');
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        }
    }

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

Любые предложения или комментарии. ТИА.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Первый шаг, который вы можете сделать, - это создать хранимую процедуру с выходными параметрами для отображения статуса вставки, которая должна отличаться при обнаружении дублирующих данных:

DELIMITER //
CREATE PROCEDURE AddUser(in @id int, @name varchar(50), @age int, out @status varchar(20))
AS
BEGIN
    -- check if duplicate exists
    IF (SELECT EXISTS (SELECT 1 FROM myTable WHERE name = @name))
        BEGIN
           -- duplicate exist, no insertion to table
           SET @status = 'duplicate';
        END
    ELSE
        BEGIN
           INSERT INTO myTable (id, name, age) VALUES (@id, @name, @age)
           SET @status = 'success';
        END
    END
END
//
DELIMITER ;

Затем используйте имя хранимой процедуры внутри MySqlCommand и используйте ее выходной параметр для возврата строки состояния:

[HttpPost]
public ActionResult AddUser(int id, string name, string age)
{
    string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
    using (MySqlConnection con = new MySqlConnection(constr))
    {
        string sqlQuery = "AddUser";
        MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@id", id);
        cmd.Parameters.AddWithValue("@name", name);
        cmd.Parameters.AddWithValue("@age", age);
        cmd.Parameters.Add("@status", MySqlDbType.VarChar).Direction = ParameterDirection.Output;
        con.Open();
        try 
        {
            cmd.ExecuteNonQuery();
            con.Close();
            return Json(new { status = (string)cmd.Parameters["@status"].Value });
        }
        catch (MySqlException ex)
        {
            con.Close();
            return Json(new { status = "error", message = ex.Message });
        }
        catch (Exception e)
        {
            con.Close();
            return Json(new { status = "error", message = e.Message });
        }

    }
}

Затем вы можете выводить сообщения в зависимости от текущего состояния в обратном вызове AJAX:

$.ajax({
    url: '/Home/AddUser',
    type: 'POST',
    data: {
       'id': id,
       'name': name,
       'age': age,
    },
    success: function (data) {
        if (data.status === "success")
        {
            alert("Data has been successfully added");
        }
        else if (data.status === "duplicate")
        {
            alert("This Data already exist on table");
        }
        else if (data.status === "error")
        {
            alert(data.message);
        }
    }
    error: function (xhr, status, err) {
        // error handling
    }
}

Если вы не хотите проверять с помощью запроса SELECT, как описано выше, рассмотрите возможность изменения таблицы с применением ограничения UNIQUE и проверьте код ошибки 1062 в MySqlException:

ALTER TABLE myTable ADD CONSTRAINT UNIQUE (name);
0 голосов
/ 07 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...