C# 为什么SQL语句更新的记录比它需要的要多?

C# 为什么SQL语句更新的记录比它需要的要多?,c#,C#,我的代码有问题,特别是更新代码 private void updatebtn_Click(object sender, EventArgs e) { String Fname = fnametb.Text; String Lname = lnametb.Text; String Age = agetb.Text; String Address = addresstb.Text; String Course = coursetb.Text; {

我的代码有问题,特别是更新代码

private void updatebtn_Click(object sender, EventArgs e)
{
    String Fname = fnametb.Text;
    String Lname = lnametb.Text;
    String Age = agetb.Text;
    String Address = addresstb.Text;
    String Course = coursetb.Text;

    {
        connection.Open();
        OleDbCommand select = new OleDbCommand();
        select.Connection = connection;
        select.CommandText = "Select * From Accounts";
        OleDbDataReader reader = select.ExecuteReader();
        while (reader.Read())
        {
            OleDbCommand insert = new OleDbCommand("UPDATE Accounts SET Firstname=@Fname, Lastname=@Lname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname='"+ reader[2].ToString()+"'", connection);

            insert.Parameters.Add("@Fname", OleDbType.VarChar).Value = Fname;
            insert.Parameters.Add("@Lname", OleDbType.VarChar).Value = Lname;
            insert.Parameters.Add("@Age", OleDbType.VarChar).Value = Age;
            insert.Parameters.Add("@Address", OleDbType.VarChar).Value = Address;
            insert.Parameters.Add("@Course", OleDbType.VarChar).Value = Course;
            insert.ExecuteNonQuery();

            fnametb.Clear();
            lnametb.Clear();
            agetb.Clear();
            addresstb.Clear();
            coursetb.Clear();
            listBox1.Items.Clear();
            searchtb.Clear();
        }
        connection.Close();
    }
}
上面是我的代码。每当我更新一条记录时,表中的所有记录都会受到影响。我认为读卡器有问题。
请帮助,谢谢。

您正在选择所有记录

select.CommandText = "Select * From Accounts";
然后将结果与读取器循环

while (reader.Read())
然后更新每个记录

String sql = "UPDATE Accounts SET Firstname=@Fname, Lastname=@Lname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname='"+ reader[2].ToString()+"'";
OleDbCommand insert = new OleDbCommand(sql, connection);
那你为什么感到惊讶

我不确定你到底想要什么。可能您忘记了在第一次选择中添加
WHERE
子句,您想使用
lnametb.Text
。但是,第一个选择只是多余的,您可以使用
WHERE
作为更新命令:

String sql = "UPDATE Accounts SET Firstname=@Fname, Lastname=@Lname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname=@LastName";
insert.Parameters.Add("@LastName", OleDbType.VarChar).Value = lnametb.Text;

顺便问一下,为什么要将更新命令命名为“插入”?

您正在选择所有记录

select.CommandText = "Select * From Accounts";
然后将结果与读取器循环

while (reader.Read())
然后更新每个记录

String sql = "UPDATE Accounts SET Firstname=@Fname, Lastname=@Lname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname='"+ reader[2].ToString()+"'";
OleDbCommand insert = new OleDbCommand(sql, connection);
那你为什么感到惊讶

我不确定你到底想要什么。可能您忘记了在第一次选择中添加
WHERE
子句,您想使用
lnametb.Text
。但是,第一个选择只是多余的,您可以使用
WHERE
作为更新命令:

String sql = "UPDATE Accounts SET Firstname=@Fname, Lastname=@Lname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname=@LastName";
insert.Parameters.Add("@LastName", OleDbType.VarChar).Value = lnametb.Text;

顺便说一句,为什么要将update命令命名为
insert

您正在迭代表中的所有记录并将其设置为一个值。。
仅访问匹配的记录并更新它是错误的

您正在迭代表中的所有记录并将其设置为一个值。。
仅访问匹配的记录并对其进行更新是错误的

问题在于,出于某种原因,您在循环中对读取器找到的每个记录执行更新。当然,读者会在表中找到你的每一个姓,所以更新会改变每一条记录

您需要删除循环,删除读卡器,并更改update命令以使用屏幕上某个输入框中的姓氏:

connection.Open();
OleDbCommand update = new OleDbCommand("UPDATE Accounts SET Firstname=@Fname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname=@Lname", connection);
update.Parameters.Add("@Fname", OleDbType.VarChar).Value = Fname;
update.Parameters.Add("@Lname", OleDbType.VarChar).Value = Lname;
update.Parameters.Add("@Age", OleDbType.VarChar).Value = Age;
update.Parameters.Add("@Address", OleDbType.VarChar).Value = Address;
update.Parameters.Add("@Course", OleDbType.VarChar).Value = Course;
update.ExecuteNonQuery();
connection.Close();

当然,这不允许您更新姓氏:为此,您需要提供某种独立的学生ID,并在
update
WHERE
子句中使用它,而不是姓氏。

问题在于,出于某种原因,您在循环中为读取器找到的每个记录执行更新。当然,读者会在表中找到你的每一个姓,所以更新会改变每一条记录

您需要删除循环,删除读卡器,并更改update命令以使用屏幕上某个输入框中的姓氏:

connection.Open();
OleDbCommand update = new OleDbCommand("UPDATE Accounts SET Firstname=@Fname, Age=@Age, Address=@Address, Course=@Course WHERE Lastname=@Lname", connection);
update.Parameters.Add("@Fname", OleDbType.VarChar).Value = Fname;
update.Parameters.Add("@Lname", OleDbType.VarChar).Value = Lname;
update.Parameters.Add("@Age", OleDbType.VarChar).Value = Age;
update.Parameters.Add("@Address", OleDbType.VarChar).Value = Address;
update.Parameters.Add("@Course", OleDbType.VarChar).Value = Course;
update.ExecuteNonQuery();
connection.Close();

当然,这不允许您更新姓氏:为此,您需要提供某种独立的学生ID,并在
update
WHERE
子句中使用它,而不是姓氏。

请为您的问题选择一个有意义的标题。第一个问题:您可能受到SQL注入攻击。为“where”零件以及新值使用参数。另外,既然这是一个更新,为什么要叫它insert?这个代码是故意更新每个帐户的,
reader
找到的每一行,它都会更新该行(如果有重复的姓氏,还会更新更多)。当然,它会更新所有记录。。您正在读卡器中选择所有记录并进行迭代…当您选择语句为“select*From Accounts”时,它将更新所有记录;请为您的问题选择一个有意义的标题。第一个问题:您可能受到SQL注入攻击。为“where”零件以及新值使用参数。另外,既然这是一个更新,为什么要叫它insert?这个代码是故意更新每个帐户的,
reader
找到的每一行,它都会更新该行(如果有重复的姓氏,还会更新更多)。当然,它会更新所有记录。。您正在读卡器中选择所有记录并进行迭代…当您选择语句为“select*From Accounts”时,它将更新所有记录;谢谢你的回答。我只是忽略了insert,因为我只是复制了insert命令,然后更改了其他变量。谢谢你的回答。我只是忽略了insert,因为我只是复制了insert命令,然后只是更改了其他变量。