【问题标题】:c# Windows form not updating values to SQL databasec# Windows 窗体不将值更新到 SQL 数据库
【发布时间】:2021-10-14 18:21:00
【问题描述】:

我的程序中有一个问题,应该将用户提供的项目存储在数据库中。我被困在编辑项目按钮上。在程序中输入新值并点击按钮保存值后,一切都会成功运行,没有错误。出现“项目已编辑”的消息框,我点击确定,但数据库保持不变。代码中没有错误,发送来更新数据库值的 SQL 代码也是正确的,但它不起作用。任何人都可以帮助解决这个问题,因为我迷路了。

这里是创建和执行 SQL 代码以更新数据库的方法。

enter image description here

【问题讨论】:

  • Never post images of code or data。请编辑您的问题并将文本复制/粘贴到问题中,格式化。这样我们就可以尝试重现问题而无需重新输入所有内容,并且屏幕阅读器可以正确索引或阅读您的问题。
  • 永远不要使用连接数据使用准备好的语句
  • 看看你的这句话能不能找到矛盾点:“代码没有错误,...但是不行”。说“它不起作用”是毫无用处的。你的“不工作”的症状是什么?你怎么知道“被发送来更新数据库值的SQL代码也是正确的”
  • 另一件事....NET 中的习惯用法(以及实现SqlConnection 类的方式)是每次与数据库通信时创建一个新的SqlConnection 实例。看起来您的 connection 变量是该类的成员。相反,你应该做类似using (var connection = new SqlConnection(GetTheConnectionStringFromSomewhere()) { /* the body of your method */ }
  • 你正在捕捉 all Exceptions,然后什么都不做。您可以使用MessageBox.Show(ex.Message); 来确保是否有 任何错误——您不只是忽略它们。

标签: c# mysql


【解决方案1】:

哇,根据最流行的代码标准和原则,代码在很多方面都是错误的 :) 但这不是问题直接涉及的内容,尽管要让您摆脱迷茫,我们必须从基本的 tbh 开始:

建议

  • 当您捕获到该异常时,请在消息框中显示它,您甚至可以在 .Show 命令中添加一个错误图标,它是内​​置的。
  • 移动连接。靠近 finally 块而不是复制它
  • 考虑改为创建一个 SQL 过程并将参数解析为该过程,此代码很容易出现您提出的 sql 注入
  • 考虑不制作程序并熟悉实体框架,它会让你的生活变得更轻松
  • 不要像那样连接,使用插值或字符串。合并,否则你会在堆栈上到处复制东西,对于每个 + 一个新的副本一个和两个到第三个,它的效率非常低
  • 当您编写代码有效且 sql 正确时,请考虑结果不是预期的,因此从技术上讲它不是 ;) 计算机最好和最坏的地方在于,它们会按照您的要求去做。李>
  • 根本不要在表单中编写您的 DAL 代码
  • 考虑检查参数的默认值
  • 您没有数据表明“项目已更新”,只有“值已保存”,您没有检查代码中的旧值

除此之外,我不明白为什么你写的东西不起作用,只要生成的 sql 在你使用的数据库中是有效的,但我想如果你做一些这些事情,错误就会出现

【讨论】:

  • 为什么会觉得这个函数在form里面?
  • 不要移动连接。关闭最终阻止。连接应该由 using 块关闭。
  • @Mary 他使用 MessageBox.Show 非常清楚,它至少在 UI 线程中。看方法start中的check是否connection不为null,表示他没有dispose这个connection,实际上sn-p代码中根本没有new这个connection,所以没有using语句无需更多重构就可以实现......我同意这可能是一个好主意,因为它是需要时间的开放部分,如果特别是保持开放,重用连接是有意义的。
  • 感谢大家的反馈,我会尽力解决您所说的一切。我知道我的代码写得有些业余。大约 2 周前,我刚刚开始为这个项目使用 c# 编码,我写的大部分内容都来自 youtube 教程等。我没有你要求我做的一些事情,但错误还没有显示. @Flydog57 询问我如何知道我发送给 SQL 的代码是正确的。我知道是因为我为程序添加了一个文本框,以便在发送代码之前将代码粘贴到其中。当我将 UPDATE 代码直接复制到 SQL 中时,它可以工作并且值会被更新。
  • @EdvaZmaj 记住这一点,你已经做得很好了 ;) 继续努力,你在正确的轨道上!
【解决方案2】:

我认为这不是连接问题,因为我有一个仅更新项目完成日期的功能,并且完全可以正常工作。

函数如下:

public static MySqlCommand FinishProject(int projID, string finishdate) {
    try {
        if (connection != null) {
            connection.Open();
            cmd = connection.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@value", projID);
            cmd.Parameters.AddWithValue("@finishdate", finishdate);
            cmd.CommandText = "UPDATE `b1c`.`projects` SET `finishdate` = (@finishdate) WHERE (`projectid` = (@value));";
            int i = cmd.ExecuteNonQuery();
            connection.Close();
            if (i != 0) {
                MessageBox.Show("Project finalized.");
                i = 0;
            }
        }
    } catch (Exception ex) {
        MessageBox.Show("Catch");
        connection.Close();
    }
    return cmd;
}

你可以看到它基本上是一样的,唯一的区别是值。

所以它不应该是一个连接的东西,因为我认为这个工作正常。

我也不认为这是SQL数据库的问题,因为所有的问题

到目前为止,与数据库有关的任何事情都在 Visual Studio 中显示为错误。

如果有人可以提供帮助,我会提供您需要的任何内容的屏幕截图,并再次感谢大家的帮助。

这是我之前粘贴的函数的屏幕截图,以便查看。

finishprojectfunction

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 你应该显示数据库相关数据的定义。
  • @JialeXue-MSFT 除了主键外,它们都是 VARCHAR,'esthours' 也曾经是整数,但有人建议我将它们全部作为 VARCHAR,所以我只需将数字转换为发送它们之前的字符串。尽管如此,我在另一个函数中遇到了类似的错误,其中程序中的变量定义与 SQL 数据库中的变量定义不匹配。但是那个错误正在显示,所以我很容易解决了。
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2016-06-24
相关资源
最近更新 更多