簡體   English   中英

C# 從 texbox 訪問數據庫更新

[英]C# access Database update from 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();
                 }

             }
}

需要改變的東西:

  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)你不能將名稱解析為 integer
  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();

}

在你學習的同時,有一個好的開始:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM