如何更新多行/如何对多个记录执行操作(C#,SQL Server)

时间:2013-08-05 02:31:35

标签: sql-server data-binding dataset c#-3.0 multiple-records

我有一个数据库表名Players(ID,名称,分数)。 这是我用数据库绑定它的代码

    private  void playerList(int team1_ID)
    {
        try
        {
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            string query = "SELECT player_name AS [Player Name] , Score AS [Score] FROM Players WHERE Team_id= " + team1_ID;

            SqlCommand cmd = new SqlCommand(query, con);
            adapter = new SqlDataAdapter(cmd);
            adapter.Fill(ds, "Players");
            dGridPlayers.DataSource = ds.Tables["Players"];
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            con.Close();
        }
    }

此代码工作正常。它返回11个玩家及其分数的列表。

现在我想对每个播放器的Score执行一些算术运算,并希望将(更新)存储回数据库表。请告诉我们如何做到这一点。

我不想每次都为每个玩家的分数update命中SQL。我希望在完成操作后一次性更新每个玩家的分数。

2 个答案:

答案 0 :(得分:2)

您需要定义

  • 用于执行更新的UPDATE SQL语句
  • 从您的C#代码
  • 中调用UPDATE
  • 使用参数化查询以避免SQL注入和糟糕的性能!!
  • 将您SqlConnectionSqlCommand的使用放入using() {....}块,以确保妥善处置

这样的事情:

// define your UPDATE query 
string updateQuery = "UPDATE dbo.Players SET Score = Score + @Value WHERE Team_id = @TeamID";

// two nested "using" blocks for conenction and command
using (SqlConnection conn = new SqlConnection(.....))
using (SqlCommand cmd = new SqlCommand(updateQuery, con))
{
    // define the parameters and provide values 
    cmd.Parameters.Add("@Value", SqlDbType.Int).Value = someValue;
    cmd.Parameters.Add("@TeamID", SqlDbType.Int).Value = teamID;

    // open connection, execute the UPDATE, close connection        
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
}

答案 1 :(得分:0)

要更新记录,只需应用类似于marc_s建议的内容。

如果要立即更新所有记录,请将主键和新值保留在这样的结构中

Dictionary<int, int> values = new Dictionary<int, int>();

字典的键将保存表的主键,值将是该记录的新分数。 当你想要更新数据库时,只需循环遍历所有这些内部的使用SQLCommand块的marc_s显示

using (SqlCommand cmd = new SqlCommand(updateQuery, con))
{
  // open connection, execute the UPDATE, close connection        
  conn.Open();
  foreach (KeyValuePair<int, int> row in values)
  {
       cmd.Parameters.Clear();
       cmd.Parameters.Add("@PK", SqlDbType.Int).Value = row.Key;
       cmd.Parameters.Add("@Score", SqlDbType.Int).Value = row.Value; 
       cmd.ExecuteNonQuery();
  } 
  conn.Close();
}