asp.netmvc验证从控制器到ajax的查询

abithluo  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(302)

目前,我有一个插入查询到我的表,我不知道如何验证它,如果数据已经存在于表中。
所以现在我只是用try-catch来处理重复条目。我只是想知道,如果值变为catch,是否可以返回一些文本,然后将其显示为alert之类的内容。
以下是我从控制器发出的查询:

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);
                }
            });
        }
    }

到目前为止,我可以成功地插入到我的表,但如果已经存在,它是一个重复它将不会做什么,所以用户将不会有一个提示,如果他们已经添加或已经存在或不存在。
任何建议或意见。蒂亚。

plicqrtu

plicqrtu1#

您可以执行的第一步是创建一个存储过程,其中的输出参数用于显示插入状态,当发现重复数据时,这些参数必须不同:

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);
eni9jsuy

eni9jsuy2#

考虑在数据库表中创建一个约束(该列上的唯一约束)。这将防止任何重复的记录被保存,即使它传递了与数据库通信的c代码。
在执行 INSERT 声明。您可以编写一个sql语句,在插入步骤之前进行检查。可能是一个存储过程,其中包含执行此操作的sql脚本,您可以从c方法调用该存储过程。
如果您是从ajax代码调用重定向响应,那么返回重定向响应是没有意义的。考虑返回一个json结构,它可以告诉客户端代码记录是成功插入的,还是发现重复的,或者代码崩溃的。
这里有一个简单的例子,我称之为 UserExist 方法,该方法检查是否存在具有指定名称的记录。如果它回来了 false ,我将继续执行我将尝试插入的代码。如果您使用的是存储过程,那么也可以在其中添加记录exist检查。

[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 属性,并向用户显示相应的消息

success:function(data)
{
  if(data.status==="success")
  {
      alert("Saved successfully");
  }
  else if(data.status==="failed")
  {
      alert(data.message);
  }
}

你可以设置 status json对象的属性 failed 当您试图插入重复记录时。
您可以为异常处理部件使用特定的异常,该部件可以在数据库级别违反unique key约束时捕获异常。同时向catch块中的用户发送消息。

相关问题