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

时间:2013-02-28 08:21:51

标签: 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;

    {
        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();
    }
}

以上是我的代码。每当我更新一条记录时,表中的所有记录都会受到影响。我认为读者有问题。 请帮助,谢谢。

3 个答案:

答案 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)

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