我的代码专门针对更新代码存在问题。
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();
}
}
以上是我的代码。每当我更新一条记录时,表中的所有记录都会受到影响。我认为读者有问题。 请帮助,谢谢。
答案 0 :(得分:5)
您正在选择所有记录,
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
作为update-command:
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;
顺便问一下,你为什么要命名你的更新命令insert
?
答案 1 :(得分:1)
问题在于,由于某种原因,您可以在循环中为读取器找到的每条记录执行更新。当然,读者会在表格中找到您的每个姓氏,因此更新将改变每一条记录!
您需要删除循环,删除阅读器,然后更改更新命令以使用屏幕上其中一个输入框中的姓氏:
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,并在WHERE
的{{1}}条款中使用它而不是姓氏。
答案 2 :(得分:0)
您正在迭代表中的所有记录并设置为一个值。 只访问匹配的记录并更新它是错误的