gpt4 book ai didi

c# - asp.net mvc/Sql 双寄存器

转载 作者:行者123 更新时间:2023-11-30 12:42:01 25 4
gpt4 key购买 nike

我创建了一个新的 MVC 项目,并将插入函数插入到数据库中。我的问题是,当我将模型输入数据库时​​,它会记录两次。试过调试,可惜找不到错误。下面的代码有没有遗漏?

 public class DbCode
{
protected SqlConnection conn;

public bool Open(string Connection = "MyDb")
{
conn = new SqlConnection(@WebConfigurationManager.ConnectionStrings[Connection].ToString());
try
{
var b = true;
if (conn.State.ToString() != "Open")
{
conn.Open();
}
return b;
}
catch (SqlException ex)
{
return false;
}
}

public bool Close()
{
try
{
conn.Close();
return true;
}
catch (Exception ex)
{
return false;
}
}

public int ToInt(object s)
{
try
{
return Int32.Parse(s.ToString());
}
catch (Exception)
{
return 0;
}

}

public int DataInsert(string sql)
{
int LastID = 0;
string query = sql + ";SELECT @@Identity;";
try
{
if (conn.State.ToString() == "Open")
{
SqlCommand cmd = new SqlCommand(query, conn);
cmd.ExecuteNonQuery();
LastID = this.ToInt(cmd.ExecuteScalar());
}
return this.ToInt(LastID);
}
catch
{
return 0;
}
}
}


public class StudentModel
{
[Required]
[StringLength(5)]
public string productname { get; set; }

[Required]
[StringLength(5)]
public string quantity { get; set; }

[Required]
[StringLength(5)]
public string price { get; set; }
}

Controller

 public class StudentController : Controller
{
protected DbCode DB = new DbCode();
public ActionResult Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveDataStudent(StudentModel student)
{
if (ModelState.IsValid)
{
DB.Open();
int i = DB.DataInsert("INSERT INTO tblproducts(productname,quantity,price) VALUES('" + student.productname + "','" + student.quantity + "','" + student.price + "')");
if (i > 0)
{
ModelState.AddModelError("Success", "Save Success");
}
else
{
ModelState.AddModelError("Error", "Save Error");
}
DB.Close();
}
return RedirectToAction("Index", "Student");
}
}

学生视角

@model MVC5.Models.StudentModel

@{
ViewBag.Title = "Index";
}


@using (Html.BeginForm("SaveDataStudent", "Student", new { @id = "Form" }, FormMethod.Post))
{
@Html.ValidationSummary();
@Html.AntiForgeryToken();
@Html.LabelFor(m => m.productname);
@Html.TextBoxFor(m => m.productname);<br/>

@Html.LabelFor(m => m.quantity);
@Html.TextBoxFor(m => m.quantity);<br />

@Html.LabelFor(m => m.price);
@Html.TextBoxFor(m => m.price);<br />

<input type="submit" value="Save" name="Save" />
}

在 webconfig 中添加了连接字符串

最佳答案

问题出在这几行:

cmd.ExecuteNonQuery();
LastID = this.ToInt(cmd.ExecuteScalar());

您执行相同的命令两次,因此 2 条记录被插入到数据库中。

为了读取最后一个标识值,我将定义一个存储过程,它将数据插入表中,然后返回最后一个标识值。描述了这种方法 here .

顺便说一句,您的代码还有另一个严重的问题。您通过连接字符串来定义 sql 命令。其中一些字符串来自用户端。这意味着您的代码容易受到 SQL 注入(inject)攻击。相反,您应该使用参数(参见 thisthis )。

我还建议不要像这行 conn.State.ToString() == "Open" 那样使用魔法常量 更好的方法是使用枚举成员:conn.State == ConnectionState.Open.

关于c# - asp.net mvc/Sql 双寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com