繁体   English   中英

asp.net mvc 5 reader.read()仅获得第一行和最后一行

[英]asp.net mvc 5 reader.read() only gets first and last rows

我有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();
                }
            }
        }

指派人参加项目工作正常。

我将进行一些更改:

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

让我们知道您是否需要有关特定Linq查询的帮助。 例如:代替db.apsk_project.Where(x => x.id == project_id).FirstOrDefault(); 您可以使用db.apsk_project.FirstOrDefault(x => x.id == project_id);

因此,请不要先进行foreach操作,然后先进行更改或更改每一行的默认值,但要考虑集合,以便消除循环并提高性能。 希望这可以帮助。 如果没有,请发表评论,以便我尝试解释更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM