ADO - ADO.NET Batch Updates & Command Batching
1. What is Command Batching?
Command batching means sending multiple SQL statements to the database in one round trip instead of executing them one by one.
Goal: reduce network latency + improve throughput.
2. Why batching matters (fact)
Each ExecuteNonQuery() call:
-
Creates a network round trip
-
Incurs parsing + execution overhead
1000 updates → 1000 round trips (slow)
1 batch → 1 round trip (fast)
3. Method 1: Multiple SQL statements in one command
Example
SqlCommand cmd = new SqlCommand(@"
UPDATE Users SET Active = 0 WHERE LastLogin < '2022-01-01';
UPDATE Orders SET Status = 'Expired' WHERE OrderDate < '2022-01-01';
", conn);
cmd.ExecuteNonQuery();
✔ One DB call
✔ Simple
❌ Harder error isolation
4. Method 2: DataAdapter Batch Updates (real ADO.NET batching)
Key property
adapter.UpdateBatchSize = 50;
Example
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Products", conn);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.UpdateBatchSize = 100;
adapter.Update(dataTable);
What happens internally
-
ADO.NET groups 100 row updates
-
Sends them as one batch
-
Repeats until complete
✔ Cleaner
✔ Supports rollback
✔ Proper error reporting
5. Method 3: Parameter array batching
StringBuilder sb = new StringBuilder();
for (int i = 0; i < orders.Count; i++)
{
sb.Append($"UPDATE Orders SET Status='Shipped' WHERE Id={orders[i]};");
}
SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
cmd.ExecuteNonQuery();
✔ Very fast
❌ Risky if not parameterized
❌ SQL injection if careless
6. Batching + Transactions (correct way)
SqlTransaction tx = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand(batchSql, conn, tx);
cmd.ExecuteNonQuery();
tx.Commit();
✔ Atomic batch
✔ Faster than per-row commits
7. Batch size tuning (important)
| Batch Size | Effect |
|---|---|
| Too small | No performance gain |
| Too large | Lock escalation, timeout |
| Sweet spot | 50–500 |
Always test with real data.
8. Batch Updates vs Bulk Copy (don’t confuse)
| Feature | Batch Update | Bulk Copy |
|---|---|---|
| INSERT only | ❌ | ✔ |
| UPDATE / DELETE | ✔ | ❌ |
| Per-row logic | ✔ | ❌ |
| Speed | Fast | Extremely fast |
9. Common mistakes
❌ Not using transactions
❌ Mixing different connection strings
❌ Huge batches causing deadlocks
❌ Assuming batching = bulk copy
10. When to use batching
-
Large UPDATE / DELETE workloads
-
Syncing modified rows
-
DataAdapter-based applications
Avoid for:
-
Single-row operations
-
Simple CRUD APIs