我正在尝试制作ATM模拟器。当我想在我的帐户中添加一些在SQL Server中注册的钱时,我不知道如何在旧值上添加值。 我的SQL表是这样的:
名称 | 姓氏 | Pin | 货币
当我想从Money列中的textBox添加Money时,我不知道如何。
代码:
con.Open();
string connString = "";
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from Useri where Pin='" + textBox1_Pin.Text + "' ";
var reader = cmd.ExecuteReader();
double balanciFillestar = Convert.ToDouble(reader[3]);
double balanciRi = balanciFillestar + double.Parse(textBox_shuma.Text);
cmd.CommandText = "update Useri set Shuma =" + balanciRi + "";
cmd.ExecuteNonQuery();
con.Close();
答案 0 :(得分:2)
最迫切需要的是过滤update
语句,而不是:
cmd.CommandText = "update Useri set Shuma =" + balanciRi + "";
你真的需要这个:
cmd.CommandText = "UPDATE Useri SET Shuma = @Shuma WHERE Pin = @Pin";
但是,在你能做到这一点之前,我们真的需要重构一切。
var selectSql = "SELECT Shuma FROM Useri WHERE Pin = @Pin";
var updateSql = "UPDATE Useri SET Shuma = @Shuma WHERE Pin = @Pin";
using (SqlConnection c = new SqlConnection(cString))
{
c.Open();
double balanciFillestar;
using (SqlCommand cmd = new SqlCommand(selectSql, c))
{
cmd.Parameters.AddWithValue("@Pin", textBox1_Pin.Text);
balanciFillestar = Convert.ToDouble(cmd.ExecuteScalar());
}
double balanciRi = balanciFillestar + double.Parse(textBox_shuma.Text);
using (SqlCommand cmd = new SqlCommand(updateSql, c))
{
cmd.Parameters.AddWithValue("@Shuma", balanciRi);
cmd.Parameters.AddWithValue("@Pin", textBox1_Pin.Text);
cmd.ExecuteNonQuery();
}
}
我在这里做了很多你想要学习的东西:
SqlConnection
未共享。 using
语句中。SqlDataReader
不用于从单行获取单个值。除#4外,所有这些事情同样重要。
第1点确保您保护自己免受SQL注入攻击。
点#2非常简单,是使用该类的唯一可行方式。它意味着被构造,打开,使用和处置。
第3点确保在所有对象上调用Dispose
方法。这对于这些类非常重要,因为它们实现了IDisposable
。他们这样做是因为他们处理非托管资源(即与SQL服务器的连接)。
第4点真的只是一个优化。数据读取器用于读取非常大的数据集,一次一行,以获得性能和资源管理。同样地,数据读取器实际上保持打开直到它被关闭或丢弃。一般来说,除了将数据用于明确目的之外,几乎总是使用比数据阅读器更好的API。
答案 1 :(得分:0)
您的代码容易受到SQL注入攻击。请考虑这一点并使用参数化查询。
string ps= "update Useri set Shuma = Shuma + @shuma WHERE Pin= @pin";
SqlCommand cmd = new SqlCommand(ps, c);
cmd.Parameters.AddWithValue("@shuma", textBox_shuma.Text);
cmd.Parameters.AddWithValue("@pin", textBox1_Pin.Text);