SQL ExecuteNonQuery for Multiple rows

本文关键字:rows Multiple for ExecuteNonQuery SQL | 更新日期: 2023-09-27 17:51:07

我有一个表("Product_Location "),包含以下列:

ProductID (PK), LocationID (PK), Quantity

我想从数据表中的行更新数据库中的表。如果行已经存在,则更新数量,否则插入新行。

我有以下方法更新表中的数量,如果productID和LocationID的组合存在,它只是更新,否则为该组合插入新行。代码:

 public bool UpdateLocationQuantity(DataSet productLocationData,
                                   SqlTransaction sqlTransaction)
        {
            try
            {
                bool result = true;
                SqlCommand command = new SqlCommand();
                //get the Transaction table which contains rows to update from dataset 
                DataTable table = productLocationData.Tables["Inventory_Transactions"];
                //Create Command Text
                string commandText = @" IF Exists (SELECT * FROM Product_Location PL 
                WHERE ProductID = @ProductID AND LocationID =  @LocationID)
                UPDATE Product_Location SET Quantity = Quantity + @Quantity 
                WHERE ProductID = @ProductID AND LocationID = @LocationID
                ELSE
                INSERT INTO Product_Location (ProductID,LocationID,Quantity) 
                VALUES(@ProductID,@LocationID,@quantity)";
                
                command = new SqlCommand(commandText, this.CurrentConnection);
                command.CommandType = CommandType.Text;
                command.Transaction = sqlTransaction;
                SqlParameterCollection paramCols = command.Parameters;
                //this loop will do the update or insert for all rows in the table
                // How can we optimize to only ONE CALL to database?
                foreach (DataRow row in table.Rows)
                {
                    paramCols.Clear();
                    paramCols.AddWithValue("@ProductID",row["ProductID"]);
                    paramCols.AddWithValue("@LocationID", row["LocationID"]);
                    paramCols.AddWithValue("@Quantity", row["Quantity"]);
                    result &= command.ExecuteNonQuery()>= 0;
                }

                return result;
            }
            catch
            {
                throw;
            }
        }

**我的问题是我们如何优化代码,所以只有一个调用ExecuteNonQuery来更新数据库,而不是在一个循环?请注意,我们没有使用StoredProcedure,所有应该来自c#和SQL查询或事务。

如果只是Update the rows,我们可以调用command。通过提供源表进行更新,它可以轻松地更新所有行,而无需使用行。但由于我使用'IF Exists',那么我们被迫使用ExecuteNonQuery,它不接受源表作为参数。

谢谢

SQL ExecuteNonQuery for Multiple rows

除了使用ParameterCollection,您还可以这样做:

 command.Parameters.Add(new SqlParameter("@ProductID", ProductData.PRODUCTID_FIELD));

 command.Parameters.AddWithValue("@ProductID", ProductData.PRODUCTID_FIELD);

等等。您实际上不必指定类型。

然后调用:

 int numOfRowsAffected = command.ExecuteNonQuery();

不返回数据集,只返回受影响的行数,因为这是一个非查询。

像你这样做的问题是你需要设置command.Parameters = paramCols;但是命令。参数是只读的,所以不能。也就是说,只要赋值,它就是只读的。只能通过AddAddWithValue方法添加参数

对于多行,在循环中添加命令

 foreach (DataRow row in table.Rows)
 {
   SqlCommand command = new SqlCommand();
   .
   .
   .
}