C# 积垢中的改良货币正在上升#

C# 积垢中的改良货币正在上升#,c#,ado.net,sql-update,currency,C#,Ado.net,Sql Update,Currency,我在ado.net中有一个窗口应用程序,用于添加、修改和删除一些表的行。我的问题是,修改了money类型的表后,操作后的货币值要大得多 String sql = "UPDATE kierowca SET imie='" + txtImie.Text + "',nazwisko='" + txtNazwisko.Text + "',data_zatrudnienia='" + txtData.Text + "',pensja='" + Convert.ToDecimal(txtPensja.Tex

我在ado.net中有一个窗口应用程序,用于添加、修改和删除一些表的行。我的问题是,修改了money类型的表后,操作后的货币值要大得多

String sql = "UPDATE kierowca SET imie='" + txtImie.Text + "',nazwisko='" + txtNazwisko.Text + "',data_zatrudnienia='" + txtData.Text + "',pensja='" + Convert.ToDecimal(txtPensja.Text) + "' WHERE imie='" + listBox2.SelectedItem.ToString() + "' AND nazwisko='" + listBox3.SelectedItem.ToString() + "';";
conn.Open();
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
cmd.Clone();
conn.Close();

我桌上的pensja是一种货币。我错了什么?

我会给你一个使用你的数据的参数化查询的例子

String sql = @"UPDATE kierowca SET imie=@imie,nazwisko=@nazwisko,
               data_zatrudnienia=@data_zatrudnienia,pensja=@pensja
               WHERE imie=@search1 AND nazwisko=@search2";

using(SqlConnection con = new SqlConnection(......))
using(SqlCommand cmd = new SqlCommand(sql, con))
{
    cmd.Parameters.Add("@imie", SqlDbType.NVarChar).Value = txtImie.Text;
    cmd.Parameters.Add("@nazwisko", SqlDbType.NVarChar).Value = txtNazwisko.Text;
    cmd.Parameters.Add("@data_zatrudnienia", SqlDbType.NVarChar).Value = txtData.Text;
    cmd.Parameters.Add("@pensja", SqlDbType.Decimal).Value = Convert.ToDecimal(txtPensja.Text);
    cmd.Parameters.Add("@search1", SqlDbType.Decimal).Value = listBox2.SelectedItem.ToString();
    cmd.Parameters.Add("@search2", SqlDbType.Decimal).Value = listBox3.SelectedItem.ToString();
    con.Open();
    int rowsChanged = cmd.ExecuteNonQuery();
    MessageBox.Show("Updated " + rowsChanged + " rows");
}
请注意,我在这里假设了两件事。
Convert.ToDecimal不会失败(最好使用decimal.TryParse测试输入是否确实是十进制值)。
查询中涉及的其他字段都是text类型(数据库中的nvarchar)

为什么这应该起作用?因为在这段代码中,一个类型为decimal且其值为decimal值的参数被传递给数据库引擎。因此,引擎不需要将字符串转换回十进制。如果数据库转换代码未正确解释区域设置小数点(逗号),此转换很容易失败或给出错误的结果


当然,如果字段的类型不同,则应首先更改所有受影响参数中的SqlDbType值,我建议使用参数绑定和命令对象,而不是字符串连接。它更安全,更易于阅读和维护。其次,尝试设置断点并获取
sql
字段的最终字符串值。检查最后一个查询以确保它正在执行您期望的内容。首先要修复的是:停止像那样构建SQL。改用参数化SQL。这可能会解决问题,也可能不会解决问题,但这绝对应该是你改变的第一件事。您还应该为连接和命令使用
语句。Convert.ToDecimal(txtPensja.Text)很容易导致区域性问题。想想千年分隔符和一些文化使用“,”其他“。。。。。这也可能是问题所在。@CyrilIselin的另一个优点是,特别是考虑到查询。。。磨光由于强制转换为与执行字符串连接而不是绑定的类型化参数相关的字符串,这最终成为一个更大的问题。