You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#操作SQL时如何将表名作为参数传入SQL语句?

问题原因

SQL参数仅支持传递查询/操作的值,表名、列名这类属于SQL语句的结构元数据,需要在SQL编译阶段确定,而参数是编译完成后才会代入的占位符,所以无法直接通过SqlParameter传递表名。

解决方案:白名单校验后拼接表名

这是安全性最高的实现方式,核心是先对传入的表名做合法性校验,避免SQL注入风险,再拼接进SQL语句,值参数仍然用标准参数化方式传递:

// 1. 先做表名校验,两种校验方式二选一即可
// 方式一:预设允许操作的表名白名单,适合表数量少的场景
var allowedTables = new HashSet<string> { "user", "order", "product" /* 替换为你业务中允许操作的所有表名 */ };
if (!allowedTables.Contains(table.Name))
{
    throw new ArgumentException("非法的操作表名");
}

// 方式二:查询数据库系统表校验表名是否真实存在,适合表数量多的场景
// 可通过查询sys.tables(SQL Server)/information_schema.tables(通用)确认表名存在后再往下执行,逻辑可自行实现

// 2. 拼接表名,值参数保持参数化传递
deleteCommand.CommandText = $"delete from {table.Name} where rowid=@ID";
deleteCommand.Parameters.Add(new SqlParameter("@ID", table.id));

注意事项

绝对不要直接把未校验的用户输入作为表名拼接进SQL语句,否则会存在严重的SQL注入漏洞。

内容的提问来源于stack exchange,提问作者sese sese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:06:03