加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – asp.net mvc / sql双重注册

发布时间:2020-12-15 22:26:40 所属栏目:百科 来源:网络整理
导读:我创建了一个新的MVC项目,并将插入函数设置为db.我的问题是,当我将模型输入db时,它会记录两次.尝试调试,但遗憾的是找不到错误.下面的代码中有没有遗漏? public class DbCode { protected SqlConnection conn; public bool Open(string Connection = "MyDb")
我创建了一个新的MVC项目,并将插入函数设置为db.我的问题是,当我将模型输入db时,它会记录两次.尝试调试,但遗憾的是找不到错误.下面的代码中有没有遗漏?

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

调节器

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注入攻击.相反,您应该使用参数(参见this或this).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读