当前,我对表有一个插入查询,并且如果数据已经存在于表中,我不知道如何验证它。
因此,到目前为止,我仅使用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);
}
});
}
}
到目前为止,我可以成功地将其插入到表中,但是如果已经存在并且是重复项,则不会执行任何操作,因此,如果用户已经添加或不存在,则不会出现提示。
任何建议或评论。 TIA。
答案 0 :(得分:0)
考虑在数据库表中创建约束(该列上的唯一约束)。这将防止保存任何重复的记录,即使它通过了与数据库通信的C#代码也是如此。
在执行INSERT
语句之前,添加检查以查看记录exist是否存在。您可以编写一条在插入步骤之前进行检查的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
处理程序中,检查响应json的status
属性,并向用户显示适当的消息
success:function(data)
{
if(data.status==="success")
{
alert("Saved successfully");
}
else if(data.status==="failed")
{
alert(data.message);
}
}
当您尝试插入重复记录时,可以将JSON对象的status
属性设置为failed
。
您可以将specific exceptions用于异常处理部分,当在数据库级别违反唯一键约束时可以捕获异常。在该catch块中也向用户发送一条消息。
答案 1 :(得分:0)
您可以做的第一步是创建一个存储过程,该存储过程的输出参数可以显示插入状态,当发现重复数据时,存储参数必须有所不同:
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
constraint来更改表,并检查MySqlException
中的错误代码1062:
ALTER TABLE myTable ADD CONSTRAINT UNIQUE (name);