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命令,然后只是更改了其他变量。