【问题标题】:How to check in the controller if a database contains an entry that has duplicate values before adding a new entry?如何在添加新条目之前检查数据库是否包含具有重复值的条目?
【发布时间】:2019-09-05 16:19:11
【问题描述】:

在我的控制器的创建方法中,我需要在将对象实际添加到数据库之前进行检查。我需要做的就是检查是否已经有一个条目具有两个属性的重复值。

我目前的想法是做一个 sql 查询来选择这 2 个值与当前对象的 2 匹配的所有条目,如果此查询的计数为 => 1,则不将该对象添加到数据库中。

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "id,name,winner,points,postDate")] Pick pick)
        {
            SqlConnection con = new SqlConnection();
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Picks WHERE [score] = @score AND [winner] = @winner", con);

            if (ModelState.IsValid && cmd.value == 0) //I know this is wrong but something like this
            {
                db.Picks.Add(pick);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(pick);
        }

我需要知道的主要事情是:

  1. 我在查询中输入“Picks”的位置是数据库名还是表名?
  2. 在查询中,“[score]”是从数据库写入属性的正确方法,“@score”是引用您当前正在使用的对象的属性值的正确方法吗?
  3. 获取查询返回的条目数量的方法是什么?

【问题讨论】:

  • 1. table 或某些 rdbms 可以是 database.table
  • 这个项目设计不好,容易出现sql注入等问题。使用依赖注入引入服务和数据层

标签: c# sql asp.net-mvc controller


【解决方案1】:

你在这里做错了一些事情。首先,您需要从您的 cmd 对象调用 ExecuteScalar() 以获取计数。其次,您没有参数化您的查询。第三,在确定模型有效之前不要计算。最后,不是主要的,但我会为您的查询添加别名:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "id,name,winner,points,postDate")] Pick pick)
    {

        if (ModelState.IsValid) 
        {
            SqlConnection con = new SqlConnection();
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Picks p WHERE p.score = @score AND p.winner = @winner", con);

            cmd.Parameters.AddWithValue("@score", points);
            cmd.Parameters.AddWithValue("@winner", winner);
            var count = (int)cmd.ExecuteScalar();

            if (count == 0)
            {

                db.Picks.Add(pick);
                db.SaveChanges();
                return RedirectToAction("Index");

            }
        }

        return View(pick);
    }

未经过测试,但应该足够接近让您继续前进!

【讨论】:

    【解决方案2】:
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "id,name,winner,points,postDate")] Pick pick)
            {
            if (ModelState.IsValid) 
            {
    
            SqlConnection con = new SqlConnection();
            SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Picks WHERE [score] = 
            @score AND [winner] = @winner", con);
            SqlDataAdpater _dt=new SqlDataAdpater(cmd);
            cmd.Parameters.AddWithValue("@score", pick.points);
            cmd.Parameters.AddWithValue("@winner", pick.winner);
            DataTable  _dt=new DataTable();
           _dt.fill(_dt);
           if(_dt.Rows.Count>0)
            {
    
                db.Picks.Add(pick);
                db.SaveChanges();
                return RedirectToAction("Index");
    
            }
        }
    
        return View(pick);
    }
    

    类属性不能直接访问,需要使用ClassName.propertyName

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多