【发布时间】: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