【问题标题】:asp.net mvc 5 reader.read() only gets first and last rowsasp.net mvc 5 reader.read() 只获取第一行和最后一行
【发布时间】:2019-05-12 12:19:20
【问题描述】:

我有 select2 列表,其中包含管理员将添加到项目中的员工。

我选择多个员工并将带有员工 ID 的 json 发送到控制器 尝试按员工获取员工,通过存储过程 [Employee] 从公司数据库 emp 列表到 web emp db。

我面临这样一个问题,即阅读器只读取第一行和最后一行并跳过中间的所有员工

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EmpAdd()
    {
        var project_id = Convert.ToInt32(Request["project"]);
        var company = Request["company"];
        var emp = Request["emp"];
        var ids = emp.Split(',');
        var project = db.apsk_project.Where(x => x.id == project_id).FirstOrDefault();

        cmd.CommandText = "Employee";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = sqlConnection1;

        foreach(var i in ids) {
            var it = Convert.ToInt32(i);
            var kortele = db.apsk_workers.Where(x => x.id == it).FirstOrDefault();
            if(kortele == null) {
                sqlConnection1.Open();

                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("company", company);
                cmd.Parameters.AddWithValue("nr", it);
                reader = cmd.ExecuteReader();

                if(reader.HasRows) {
                    while(reader.Read()) {

                        apsk_workers apsk = new apsk_workers();

                        var v = reader.GetString(1);
                        var p = reader.GetString(2);
                        var d = reader.GetDateTime(3);

                        apsk.kof_id = 0;
                        apsk.algos_tipas = "";
                        apsk.vardas = v;
                        apsk.pavarde = p;
                        apsk.ar_dirba = d;
                        apsk.company = company;
                        apsk.manager = User.Identity.Name;
                        apsk.id = it;

                        db.apsk_workers.Add(apsk);
                        db.SaveChanges();
                    }
                }
                sqlConnection1.Close();

                apsk_assigned _Assigned = new apsk_assigned();

                _Assigned.project_id = project_id;
                _Assigned.project = project.project;
                _Assigned.worker_id = it;

                db.apsk_assigned.Add(_Assigned);
                db.SaveChanges();
            } else {
                var ar_projekte = db.apsk_assigned.Where(x => x.project_id == project_id && x.worker_id == it).FirstOrDefault();
                if(ar_projekte == null) {
                    apsk_assigned _Assigned = new apsk_assigned();

                    _Assigned.project_id = project_id;
                    _Assigned.project = project.project;
                    _Assigned.worker_id = it;

                    db.apsk_assigned.Add(_Assigned);
                    db.SaveChanges();
                }
            }
        }

将人员分配给项目工作正常。

【问题讨论】:

  • ASP.NET MVC 是一个 Web 框架。它没有读者。您的代码似乎将 ADO.NET 命令与 Entity Framework 混合在一起。为什么要把它们混在一起?为什么不将存储过程映射到实体?
  • 除此之外,代码似乎在循环中打开了一个连接inside,但在循环外关闭了它。这将引发第二次迭代。只需打开一次连接。如果你使用Where(x=>ids.Contains(x.id)),你可以摆脱循环。这将被转换为WHERE ID IN (1,4,7...) 子句。您可以在其余代码中使用检索到的对象的Id 属性
  • 打开和关闭的连接位置没有给出任何不同的结果,在读取循环之前,我看到我得到了所有让我们说 5 个员工 ID,但是一旦涉及到阅读器,它只保留第一个和最后一个,甚至认为在调用过程时它会返回所有数据。
  • 而且我正在做网站而不是 windows 窗体所以 ado.net 与这里无关。
  • 它与您的代码有关。 ADO.NET 是数据访问库,而不是桌面 UI。 EF 在 ADO.NET 之上工作,您的代码直接使用 ADO.NET 类。 SqlCommand、SqlConnection、SqlDataReader 都是 ADO.NET 类。

标签: c# asp.net entity-framework ado.net


【解决方案1】:

我会做一些改变:

  • 您正在将 EF 与 ado.net 混合使用因此请删除所有打开和关闭的连接。也符合Parameters 等。
  • 由于 id 是一个字符串,您可以将其转换为整数列表:https://stackoverflow.com/a/9301290/169714
  • 使用 Linq,您可以分配项目已知的员工
  • 使用 Linq,您可以先添加未知员工,并在全部添加后保存更改。

如果您需要有关特定 Linq 查询的帮助,请告诉我们。 例如:您可以使用 db.apsk_project.FirstOrDefault(x => x.id == project_id); 而不是 db.apsk_project.Where(x => x.id == project_id).FirstOrDefault();

因此,不要先执行 foreach,然后再执行第一个或默认更改每行,而是在集合中思考,这样您就可以消除循环并提高性能。希望这可以帮助。如果没有,请发表评论,以便我尝试解释更多。

【讨论】:

  • 感谢您的回答和帮助改进我的代码。问题出在表单选择中,它返回了被解雇的员工,并且在这里返回了 null。
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 2020-06-21
  • 2014-09-29
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多