Handling Dynamic Query Requirements
Handling Dynamic Query Requirements
Real-world applications often require dynamic queries where table names, column names, or query structure varies. Parameterized queries only protect data values, not SQL identifiers, requiring additional strategies:
// C# implementation with dynamic but safe queries
public class SafeDynamicQuery
{
private readonly HashSet<string> _allowedTables = new HashSet<string>
{
"users", "products", "orders"
};
private readonly Dictionary<string, string> _allowedColumns = new Dictionary<string, string>
{
{"name", "user_name"},
{"email", "user_email"},
{"date", "created_at"}
};
public DataTable ExecuteDynamicQuery(string tableName, string sortColumn, string filterValue)
{
// Validate table name against whitelist
if (!_allowedTables.Contains(tableName))
throw new ArgumentException("Invalid table name");
// Map user-provided column to actual column name
if (!_allowedColumns.TryGetValue(sortColumn, out string actualColumn))
throw new ArgumentException("Invalid sort column");
// Build query with validated identifiers and parameterized values
string query = $"SELECT * FROM {tableName} WHERE status = @status ORDER BY {actualColumn}";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@status", filterValue);
// Execute safely
}
}
}