Winforms Linq到SQL添加和更新

Winforms Linq到SQL添加和更新,winforms,linq,Winforms,Linq,从我的代码中可以看出,我绝对是个初学者。在搜索了关于LINQ到SQL问题的其他类似问题之后,我发现自己似乎仍然停留在两个目标上。1使用来自三个组合框和一个日期选择器的用户选择的输入添加新条目,2使用datagridview中的交互更新现有数据库条目 我的windows窗体datagridview显示以下输出 **select b.Date, a.EmployeeName, c.ProjectName, b.Hours from dbo.Employees a left oute

从我的代码中可以看出,我绝对是个初学者。在搜索了关于LINQ到SQL问题的其他类似问题之后,我发现自己似乎仍然停留在两个目标上。1使用来自三个组合框和一个日期选择器的用户选择的输入添加新条目,2使用datagridview中的交互更新现有数据库条目

我的windows窗体datagridview显示以下输出

**select b.Date, a.EmployeeName, 
       c.ProjectName, b.Hours
from  dbo.Employees a
left outer join dbo.EmployeeProjectHours b
    on a.EmployeeId = b.EmployeeId
left outer join dbo.Projects c
    on b.ProjectId = c.ProjectId**
这是我的ADD方法,用户向我提供ProjectName、EmployeeName、Date和Hours。对于外行的任何想法都将不胜感激

运行insert时没有出现错误,但dab中也没有添加任何内容

     using (ProjectHoursDataContext dbInsert = new ProjectHoursDataContext())
     {
        this.Validate();

        EmployeeProjectHour empHours = new EmployeeProjectHour();

        empHours.Date = dateDateTimePicker.Value;
        empHours.Hours = Convert.ToDecimal(hoursComboBox.Text);
        empHours.ProjectId = dbInsert.Projects.First(p => p.ProjectName == projectNameComboBox.Text).ProjectId;
        empHours.EmployeeId = dbInsert.Employees.First(m => m.EmployeeName == employeeNameComboBox.Text).EmployeeId;

        db.EmployeeProjectHours.InsertOnSubmit(empHours);
        dbInsert.SubmitChanges();

     }
下面是我的更新,它试图直接从datagridview使用更新。我收到以下错误:System.Windows.Forms.dll中发生了类型为“System.ArgumentException”的第一次意外异常

到目前为止,我的最佳猜测是,您希望编辑和更改现有的员工、项目和员工项目工时记录

所以你会这样做:

 using (ProjectHoursDataContext dbInsert = new ProjectHoursDataContext())
 {
    this.Validate();

    // Get the records
    Employee emp = new Employee();
    Project proj = new Project();
    EmployeeProjectHour empHours = new EmployeeProjectHour();

    // Set new values to Employees tables
    emp = dbInsert.Employees
       .First(m => m.EmployeeName == employeeNameComboBox.Text);
    //just get the empployee

    //setting values will update it    
    emp.EmployeeName = employeeNameComboBox.Text;

    // GET an existing project
    proj = dbInsert.Projects
                  .First(p => p.ProjectName == projectNameComboBox.Text);

    //update its values.  
    proj.ProjectName = projectNameComboBox.Text;
    proj.ProjectDescription = "Test";

    //GET an empHours
     empHours = dbInsert.Projects.First(p => p.EmployeeId == emp.EmployeeId && 
                          p.ProjectId == proj.ProjectId);
    //set its values
    empHours.Date = dateDateTimePicker.Value;
    empHours.Hours = Convert.ToDecimal(hoursComboBox.Text);

    dbInsert.SubmitChanges();
 }

除了下面的新代码外,我还将我的项目数据库的增量状态设置为“否”。我在前面的stackoverflow讨论中将其设置为“是”。谢谢

  public void AddInfo()
  {
     db.Connection.Open();

        this.Validate();

        EmployeeProjectHour empHours = new EmployeeProjectHour();

        empHours.Date = dateDateTimePicker.Value;
        empHours.Hours = Convert.ToDecimal(hoursComboBox.Text);
        empHours.ProjectId = db.Projects.First(p => p.ProjectName == projectNameComboBox.Text).ProjectId;
        empHours.EmployeeId = db.Employees.First(m => m.EmployeeName == employeeNameComboBox.Text).EmployeeId;

        db.EmployeeProjectHours.InsertOnSubmit(empHours);
        db.SubmitChanges();
        db.Connection.Close();

  }

看起来您首先获取现有员工id,然后将新员工id设置为该值。EmployeeID是主键吗?身份?是的,EmployeeID是主键。在EmployeeName组合框中,我限制只从现有员工中进行选择,这就是为什么我要将employeeID设置为与所选员工的db中已有的内容相匹配。我猜我的格式是不正确的,或者这是我设置的顺序问题?那么,您是否正在尝试向现有员工添加项目?或者看起来更像是现有的员工项目和员工项目工时记录,您应该编辑它们?是的。在你写了这些之后,我意识到我需要把所有的东西都注释掉,除了InsertOnSubmit for EmployeeProjectHours。但当我提交更改时,仍然会抛出一个异常:您看到我的答案了吗?您从那里尝试了代码吗?使用ProjectHoursDataContext dbInsert=newprojecthoursdatacontext{this.Validate;EmployeeProjectHour empHours=new EmployeeProjectHour;empHours.Date=dateDateTimePicker.Value;empHours.Hours=Convert.ToDecimalhoursComboBox.Text;empHours.ProjectId=dbInsert.Projects.Firstp=>p.ProjectName==projectNameComboBox.Text.ProjectId;empHours.EmployeeId=dbInsert.Employees.Firstm=>m.EmployeeName==employeeNameComboBox.Text.EmployeeId;dbInsert.SubmitChanges;}
  public void AddInfo()
  {
     db.Connection.Open();

        this.Validate();

        EmployeeProjectHour empHours = new EmployeeProjectHour();

        empHours.Date = dateDateTimePicker.Value;
        empHours.Hours = Convert.ToDecimal(hoursComboBox.Text);
        empHours.ProjectId = db.Projects.First(p => p.ProjectName == projectNameComboBox.Text).ProjectId;
        empHours.EmployeeId = db.Employees.First(m => m.EmployeeName == employeeNameComboBox.Text).EmployeeId;

        db.EmployeeProjectHours.InsertOnSubmit(empHours);
        db.SubmitChanges();
        db.Connection.Close();

  }