为什么获胜';这个带有参数化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");
}
}
它总是显示"不影响行"!(除非我输入的不是数字,否则会抛出异常)
有人知道发生了什么事吗?
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),看看在"工作"和非工作情况下(可能在异常情况下),数据库上实际执行了什么查询?
这可以让您很好地了解正在发生的事情…