c#-独立更新具有相同id的ms access数据库记录

c#-独立更新具有相同id的ms access数据库记录,c#,database,winforms,datatable,C#,Database,Winforms,Datatable,我为一些学生提供了一个关系型ms access数据库。(数据库中已经填充了一些数据) 我的数据库中有两个表: 1.tblStuInfo了解学生的一般信息。 2.TBL每年管理其成绩和兴趣的教育 名为“StuID”的列是tblStuInfo和外键中的主键 在教育方面 & 在my form load事件中,动态文本框会自动为TBLStueEducation表中的每条记录创建,并且它们会正确地填充,不会出现任何问题 我的问题是,当我通过winform编辑一些信息(此处假设仅为EduYear)并单击

我为一些学生提供了一个关系型ms access数据库。(数据库中已经填充了一些数据) 我的数据库中有两个表: 1.tblStuInfo了解学生的一般信息。 2.TBL每年管理其成绩和兴趣的教育

名为“StuID”的列是tblStuInfo和外键中的主键 在教育方面

&

在my form load事件中,动态文本框会自动为TBLStueEducation表中的每条记录创建,并且它们会正确地填充,不会出现任何问题

我的问题是,当我通过winform编辑一些信息(此处假设仅为EduYear)并单击“保存”时,所有记录将获得相同的值(最后一个文本框)

这是我的保存按钮代码:

connection.Open();

OleDbCommand updateStuEducation = new OleDbCommand();
updateStuEducation.Connection = connection;
readStuEducation.CommandText = "select * from tblStuEducation where stuID = 1000";

//textBoxNamesArray use LINQ to save all values from textboxes with txtEduYear in their name
    string[] textBoxNamesArray = tabpEdu.Controls.OfType<TextBox>().Where(a => a.Name.Contains("txtEduYear")).Select(a => a.Text).ToArray();
    Int32 i = 0;

    foreach (string value in textBoxNamesArray)
    {
        readStuEducation.CommandText = "update tblStuEducation set EduYear = '" + value[i] + "'";
        readStuEducation.ExecuteNonQuery();
        i++;
    }

    connection.Close();

等等…

我要做三个改变

1) 您需要一个WHERE子句--“update TBLSTUEDUCTION set EduYear=x”将在表中的每条记录上更新EduYear

2) 这里有一个SQL注入漏洞;连接字符串以生成CommandText是不可接受的。你需要打电话或类似的事情。(读)

3) 在访问
值[i]
时,可能会出现一些混乱;因为
value
已在相应的文本框中包含该值。值[i]将从该字符串返回单个字符

所以你应该得到这样的东西

readStuEducation.CommandText = "update tblStuEducation set Grade = ? where stuID = ? and EduYear = ?";
readStuEducation.AddParameter(value); // value to set
readStuEducation.AddParameter(1000); // student ID
readStuEducation.AddParameter(eduYear); // student ID
readStuEducation.ExecuteNonQuery();

我会做三个改变

1) 您需要一个WHERE子句--“update TBLSTUEDUCTION set EduYear=x”将在表中的每条记录上更新EduYear

2) 这里有一个SQL注入漏洞;连接字符串以生成CommandText是不可接受的。你需要打电话或类似的事情。(读)

3) 在访问
值[i]
时,可能会出现一些混乱;因为
value
已在相应的文本框中包含该值。值[i]将从该字符串返回单个字符

所以你应该得到这样的东西

readStuEducation.CommandText = "update tblStuEducation set Grade = ? where stuID = ? and EduYear = ?";
readStuEducation.AddParameter(value); // value to set
readStuEducation.AddParameter(1000); // student ID
readStuEducation.AddParameter(eduYear); // student ID
readStuEducation.ExecuteNonQuery();

谢谢你,史蒂夫。但它仍然使用最新的文本框值更新stuID=1000的记录中的所有EduYear列。我需要用每一行的独立年份值来更新每一行;这将为特定的学生在特定的年份设定分数。这正是我的问题。除了stuID,所有其他列都可以有不同的值,因此条件可能会有所不同。我正在寻找一个解决方案来浏览更新查询中的每一行。亲爱的Steve,当我们使用DataReader时。我可以通过在第二个表中添加一个新列(counter)并在WHERE子句中添加另一个条件来解决这个问题,正如u所建议的那样。我只是想说声谢谢,谢谢史蒂夫。但它仍然使用最新的文本框值更新stuID=1000的记录中的所有EduYear列。我需要用每一行的独立年份值来更新每一行;这将为特定的学生在特定的年份设定分数。这正是我的问题。除了stuID,所有其他列都可以有不同的值,因此条件可能会有所不同。我正在寻找一个解决方案来浏览更新查询中的每一行。亲爱的Steve,当我们使用DataReader时。我可以通过在第二个表中添加一个新列(counter)并在WHERE子句中添加另一个条件来解决这个问题,正如u所建议的那样。我只是想说声谢谢。