首页 > 解决方案 > C#从texbox访问数据库更新

问题描述

我正在做一个数据库项目,程序的很大一部分已经完成,但遇到了一个问题。我有一个名为员工的数据库,我在文本框中使用 emp_ID 进行搜索,并从数据库中获取属性(姓名、姓氏)并将它们写入另一个文本框。当我单击保存按钮时,我希望它从文本框中更新姓名和姓氏。这是我的代码看起来不错但不起作用。伪代码:从表 Employee 更新姓名和姓氏,其中 ID = emp_ID

错误:

输入字符串的格式不正确。

我的代码:

 private void button1_Click(object sender, EventArgs e)
        {
             String id = searchTB.Text;
             string Name = nametb.Text;
             using (var connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Employee.accdb"))
             using (var command = connection.CreateCommand())
             {
                 command.CommandText = "select *from Employee where [emp_ID]= " + id + " ";
                 command.Parameters.AddWithValue("Name", int.Parse(nametb.Text));
                 command.Parameters.AddWithValue("Surname", int.Parse(surnametb.Text));
                 connection.Open();
                 var reader = command.ExecuteReader();
                 while (reader.Read())
                 {
                     nametb.Text = reader["Name"].ToString();
                     surnametb.Text = reader["Surname"].ToString();
                 }

             }
}

标签: c#sqldatabasems-access

解决方案


需要改变的东西:

  1. String id = searchTB.Text;成为string id = searchTB.Text;
  2. "select *from成为"select * from
  3. "select *from Employee where [emp_ID]= " + id + " "就像where emp_Name = @Name and emp_Surname = @Surname你按名字和姓氏搜索一样。
  4. "Name", int.Parse(nametb.Text)您不能将名称解析为整数
  5. sql 语句应该足够安全以防止SQL 注入
  6. 如果 camelCase 变量可以更好地命名(阅读有关 camelCase 和 PascalCase 命名的信息)

最后,使用同一个按钮搜索和编辑是错误的(阅读SOLIDSRP原理

所以,最初,你需要类似下面的代码(我没有测试它,因为我没有访问但看起来不错)。

请注意,我不了解您的数据库,因此您应该输入正确的字段名称

对于查询端:

private void button1_Click(object sender, EventArgs e)
{
    // Search Button -- Query
    
    string name = nameTb.Text;
    string surName = surNameTb.Text;
    
    var connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Employee.accdb");
    var query = new OleDbCommand("select emp_ID, emp_Name, emp_Surname from Employee where emp_Name = @Name, emp_Surname = @Surname", connection);
    query.Parameters.AddWithValue("@Name", name);
    query.Parameters.AddWithValue("@Surname", surName);

    connection.Open();

    OleDbDataReader reader = query.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            idTb.Text = reader["emp_ID"].ToString();   //<<=== this is the primary key that never updated
            nameTb.Text = reader["emp_Name"];
            surNameTb.Text = reader["emp_Surname"];
        }
    }
    
    connection.Close();
    reader.Close();
    query.Dispose();
}

对于更新命令端(另一个按钮):

private void button2_Click(object sender, EventArgs e)
{
    // Update Button -- Command

    string id = idTb.Text;
    string name = nameTb.Text;
    string surName = surNameTb.Text;

    var connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Employee.accdb");
    OleDbCommand command = new OleDbCommand("update Employee set emp_Name = @Name, emp_Surname = @Surname where emp_ID = @Id", connection);
    command.Parameters.AddWithValue("@Id", id);
    command.Parameters.AddWithValue("@Name", name);
    command.Parameters.AddWithValue("@Surname", surName);
    command.ExecuteNonQuery();

    connection.Close();
    command.Dispose();

}

在你学习的同时,有一个好的开始:)


推荐阅读