【问题标题】:How to update multiple rows / How to perform Operation on multiple records (C#, SQL Server)如何更新多行/如何对多条记录执行操作(C#、SQL Server)
【发布时间】:2013-08-05 16:01:55
【问题描述】:

我有一个数据库表名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 执行一些算术运算,并希望将数据存回(更新)到数据库表中。请告诉如何做到这一点。

(我不想每次都打SQL到update每个玩家的分数。我想在完成操作后一次性更新每个玩家的分数。)

【问题讨论】:

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


    【解决方案1】:

    你需要定义

    • 使用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();
    }
    

    【讨论】:

    • 实际上在我的代码中,teamID 用于检索特定球队的球员。所以我想通过他们的 PlayerID 更新玩家得分。检索数据库不是问题,问题是我想在每个玩家的Score 字段中执行一些更新。
    【解决方案2】:

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

    如果您想一次更新所有记录,请将主键和新值保留在这样的结构中

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

    字典的键将保存表的主键,值将是该记录的新分数。 当你想更新数据库时,只需在 using 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();
    }
    

    【讨论】:

    • 谢谢@Maisie .. 你能告诉我如何对多个检索到的行执行一些算术运算吗?
    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    相关资源
    最近更新 更多