【问题标题】:Why won't this C# database application with parameterized sql work?为什么这个带有参数化 sql 的 C# 数据库应用程序不能工作?
【发布时间】:2012-01-04 23:35:26
【问题描述】:

我有一个带有名为 ageTextBox 的文本框的 C# 表单应用程序;

按下按钮后,应用程序应该更新我的 MySQL 数据库中的一个或多个值,但它没有。

代码如下:

private void button2_Click(object sender, EventArgs e)
    {
        // this works perfectly if I put an actual number instead of @ag
        string sql = "update persons set age = 30 where age = @ag";
        OdbcCommand cmd = new OdbcCommand(sql, conn);
        cmd.Parameters.Add("@ag", OdbcType.Int);
        cmd.Parameters["@ag"].Value = ageTextBox.Text;
        int aff = cmd.ExecuteNonQuery();
        if (aff == 0)
            MessageBox.Show("No rows afected");
        else
            MessageBox.Show("Everything went as planned");
        }
    }

它总是显示“没有行受到影响”! (除非我输入的不是数字,否则会抛出异常)

有人知道怎么回事吗?

【问题讨论】:

  • 尝试在值行上使用Convert.ToInt(ageTextBox.Text)。 MySQL 可能会窒息,因为您传递的是字符串而不是 int。
  • @MichaelTodd 将其添加为答案;看起来很有说服力
  • @MichaelTodd 我已经尝试过 int.parse 和 Convert.ToInt... 仍然无法正常工作... 无论如何感谢您的建议。
  • 我记得之前的一个场景,在与数字列进行比较时提供字符串 arg 实际上会执行字符串比较(即 MySQL 会将列转换为字符串值)。
  • 忽略返回的行数,MySQL 中的行是否真的发生了变化?

标签: c# mysql sql parameters


【解决方案1】:

cmd.Parameters.Add 已过时,您应该使用 cmd.Parameters.AddWithValue 尝试改用它:

cmd.Parameters.AddWithValue("@ag", int.Parse(ageTextBox.Text));

【讨论】:

  • 应该真正提供一个实际的数字参数。
  • 完成后请确保您正在处理您的连接、命令等。
  • 在哪里记录为过时?实际上,在许多方面,尤其是不建议将 AddWithValue 用于字符串,因为它可能导致使用可变参数长度(导致查询计划未命中)并导致 db 类型错误(unicode 与 ansi 等) .这是 MSDN 页面;没有过时:msdn.microsoft.com/en-us/library/8dcw81x5.aspx
  • @Xtian:在这里使用 OdbcCommand。您正在引用 SqlClient。
  • @@rowcount 在 MySQL 的任何地方都不存在。
【解决方案2】:

可能 ODBC 没有报告行数(相当于SET NOCOUNT ON)。您可以尝试添加select @@rowcount 作为最终语句(或特定数据库的等效语句),并使用ExecuteScalar()(将读取该值)。

【讨论】:

    【解决方案3】:

    这不是一个解决方案,而是一个调试技巧。既然您说在代码中输入数字时它可以正常工作,您能否尝试为 MySQL 启动一个 SQL 跟踪器工具(我想有一个可用的 somwhere)并查看在“工作”中在数据库上实际执行的查询在非工作情况下(可能在例外情况下)?

    这可以让您很好地了解正在发生的事情......

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多