首页 > 解决方案 > 在 C# 中更新 SQL 数据表?

问题描述

    private void button1_Click(object sender, EventArgs e)       
  {
        string CS = ConfigurationManager.ConnectionStrings["connection_string"].ConnectionString;
        OleDbConnection C = new OleDbConnection(CS);
        C.Open();
        OleDbCommand CMD = new OleDbCommand("", C);
        CMD.CommandText = "SELECT COUNT(*) FROM Applicants WHERE ApplicantID = ?";
        CMD.Parameters.AddWithValue("@ApplicantID", textBox1.Text);
        if (Convert.ToInt32(CMD.ExecuteScalar()) > 0)
        {
            CMD.CommandText = "UPDATE Onboarding SET " +
                "BackgroudCheck = @BGC, PhotoID = @PID, " +
                "TrainingHoursOutOf40 = @THOO, DrugTestTaken = @DTT, PassedDrugTest = @PDT" +
                "WHERE ApplicantID = @AID";
            CMD.Parameters.AddWithValue("@AID", textBox1.Text);
            CMD.Parameters.AddWithValue("@BGC", CheckBox1);
            CMD.Parameters.AddWithValue("@PID", CheckBox2);
            CMD.Parameters.AddWithValue("@THOO", TextBox2.Text);
            CMD.Parameters.AddWithValue("@DTT", CheckBox3);
            CMD.Parameters.AddWithValue("@PDT", CheckBox4);
            MessageBox.Show("Applicant Updated Successfully");
        }
        else
        {
            MessageBox.Show("Applicant Does Not Exists");
        }
        C.Close();
  }

我正在尝试更新数据表。当我尝试在表单中更新时,我确实会收到一个消息框,上面写着“申请人更新成功”,但是当我转到数据表或以另一种形式查看它时,该表没有更新。

标签: c#sql

解决方案


这里有几个问题

  • Ole 不使用命名参数。您可以为参数命名,但它们会被忽略。您必须以正确的顺序添加正确数量的参数
  • 用于using确保数据库资源在您使用完毕后关闭和处置
  • 您从未真正执行过 UPDATE 查询
  • 你没有把 .Checked 从你的复选框中检索布尔值
  • 您不需要先选择。如果更新没有更新记录,则申请人不存在。如果没有要更新的内容,则 UPDATE 不会出错。ExecuteNonQuery 返回更新了多少行的 int
  • 将控件放在表单上后,您确实应该重命名控件。充满 Label57、Button29 的代码被有效地混淆(无意义的垃圾),很难维护
  • 在 c# 方法中声明的变量用 camelCaseLikeThis 命名,而不是 ALLCAPS
  • 请注意,如果这是您正在使用的基于文件的数据库(如果它是 ole,则可能是 Access)磁盘上存在数据库文件的多个副本。无数问题被问到“为什么我的数据库没有更新” - 只是程序正在更新 bin 文件夹中的数据库,而开发人员正在查看项目文件夹中的数据库副本(复制过来每次运行项目时 bin 文件夹 db 的顶部,这是程序“从不记得任何东西”的另一个原因)
  • 如果您使用的是 Access,您可以通过切换到广泛使用的商业级数据库(sql server Express 是免费的,SQLite 绝对值得在 Access 上使用)和学习实体框架来为自己带来巨大的好处。我很欣赏您正在进行学习之旅,但您现在所学的大部分内容并没有在现实世界中广泛使用,因为这有点类似于编写自己的图形驱动程序或 Json 解析器,是一种乏味的浪费时间。如果您想坚持使用这种方法,请查看 Dapper,它消除了“通过按钮单击处理程序中的 SQL 字符串访问数据”的很多痛苦——打开和关闭连接、填写参数和类型、提取数据读者和铸造它;所有这些工作都可以通过软件完成,而 dapper 可以减少你的代码'c.Execute("UPDATE ...", new { bgcCheckbox.Checked, ... aidTextbox.Text })
  private void button1_Click(object sender, EventArgs e)       
  {
    string cs = ConfigurationManager.ConnectionStrings["connection_string"].ConnectionString;
    using(OleDbConnection c = new OleDbConnection(cs)){
      c.Open();
      using(OleDbCommand cmd = new OleDbCommand("", c)){
       
          cmd.CommandText = "UPDATE Onboarding SET " +
                "BackgroudCheck = ?, PhotoID = ?, " +
                "TrainingHoursOutOf40 = ?, DrugTestTaken = ?, PassedDrugTest = ?" +
                "WHERE ApplicantID = ?";
          
          cmd.Parameters.AddWithValue("@BGC", CheckBox1.Checked);
          cmd.Parameters.AddWithValue("@PID", CheckBox2.Checked);
          cmd.Parameters.AddWithValue("@THOO", TextBox2.Text);
          cmd.Parameters.AddWithValue("@DTT", CheckBox3.Checked);
          cmd.Parameters.AddWithValue("@PDT", CheckBox4.Checked);
          cmd.Parameters.AddWithValue("@AID", textBox1.Text);
          if(cmd.ExecuteNonQuery()>0)
            MessageBox.Show("Applicant Updated Successfully");
          else
            MessageBox.Show("Applicant Does Not Exists");
      }  
    }
  }

推荐阅读