如何在SQL中的列的先前值上添加新值

时间:2013-12-14 08:48:08

标签: c# sql sql-server

我正在尝试制作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();

2 个答案:

答案 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();
    }
}

我在这里做了很多你想要学习的东西:

  1. SQL语句已参数化。
  2. SqlConnection 未共享。
  3. ADO.NET对象包含在using语句中。
  4. SqlDataReader不用于从单行获取单个值。
  5. 除#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);