c# - 在 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();
}
我正在尝试更新数据表。当我尝试在表单中更新时,我确实会收到一个消息框,上面写着“申请人更新成功”,但是当我转到数据表或以另一种形式查看它时,该表没有更新。
解决方案
这里有几个问题
- 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");
}
}
}
推荐阅读
- c# - DynamoDB 条件 SaveAsync
- angular - 从 WebStorm Jest Testrunner 开始,Jest 单元测试不起作用
- azure-devops - 部署后文件已被删除
- python - 在python中使用负前瞻正则表达式替换丢失的')'时出错
- c# - MVC:格式化标点符号(十进制?,nb-NO)时如何修复来自HttpPost的空值?
- python - 使用 spaCy 添加多个 EntityRuler (ValueError: 'entity_ruler' 已存在于管道中)
- c# - 在使用 ChannelWriter 的 SignalR Core 中:如果出现异常,我是否需要调用 TryComplete 两次?
- python-3.x - 我想打开在谷歌上搜索时出现的第一个链接
- regex - 带有负参数的正则表达式 AND 运算符
- python - Bazel:读取具有相对路径的文件,而不是工作区