1

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

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

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

4

3 回答 3

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更新命令:

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-command insert

于 2013-02-28T08:26:36.933 回答
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您的子句中使用它UPDATE而不是姓氏。

于 2013-02-28T08:27:16.213 回答
0

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

于 2013-02-28T08:27:05.093 回答