为什么获胜';这个带有参数化sql的C#数据库应用程序

本文关键字:sql 参数 应用程序 数据库 获胜 为什么 | 更新日期: 2023-09-27 18:19:39

我有一个C#窗体应用程序,它有一个名为ageTextBox的TextBox;

按下按钮后,应用程序应该更新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");
        }
    }

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

有人知道发生了什么事吗?

为什么获胜';这个带有参数化sql的C#数据库应用程序

cmd.Parameters.Add已过时,您应该使用cmd.Parameters.AddWithValue,请尝试使用以下内容:

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

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

这不是一个解决方案,而是一个调试技巧。既然你说当你在代码中输入一个数字时它可以正常工作,你能试着为MySQL启动一个SQL跟踪工具吗(我想有一个可用的Somware),看看在"工作"和非工作情况下(可能在异常情况下),数据库上实际执行了什么查询?

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