Roadmap › ADO.NET — Connected & Disconnected Data Access › Module: Connected Architecture
Lessons in this course (9)
3. Parameters and SQL injection
Basic★ Must knowLesson 3 of 9
csharp
// ❌ NEVER — SQL injection: name = "x'; DROP TABLE Users;--"
var bad = new SqlCommand("SELECT * FROM Users WHERE Name = '" + name + "'", conn);
// ✅ Parameterised
var good = new SqlCommand("SELECT * FROM Users WHERE Name = @name", conn);
good.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = name;- Parameters send values separately from SQL text — they are never executed as code.
- Prefer
Parameters.Add(name, SqlDbType, size)overAddWithValue:AddWithValueinfers the type (e.g.nvarchar(4000)for strings), which can cause implicit conversions that prevent index seeks (varchar column vs nvarchar parameter) and plan-cache bloat. - Pass
DBNull.Valuefor nulls, notnull. - Dynamic table/column names can't be parameters — validate against an allow-list or use
QUOTENAMEin SQL.