【发布时间】:2011-02-03 21:37:26
【问题描述】:
我正在尝试在 C# 中针对 SQL 服务器数据库创建参数化查询。
代码:
query = new StringBuilder( "SELECT @fields FROM @tables");
using(SqlConnection connection = new SqlConnection(connection))
{
SqlCommand command = new SqlCommand(query.ToString(), connection);
command.Parameters.AddWithValue("@fields", fields.ToString());
command.Parameters.AddWithValue("@tables", tables.ToString());
try
{
connection.Open();
Int32 rowsAffected = command.ExecuteNonQuery();
Console.WriteLine("RowsAffected: {0}", rowsAffected);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
奇怪的是这会失败并显示消息“必须声明表变量\”@tables\”。但是正如您所看到的,它已明确定义。
所以我的问题是:
- 能否传递一个参数来定义 FROM 中的表格列表 陈述?
- 如果可以,为什么不可以 这行得通吗?
【问题讨论】:
-
作为这些关于动态 SQL 的答案的旁注。在构建动态 SQL 时,始终、始终、始终要非常小心,以避免 SQL 注入。当您动态构建 SQL 时,您会敞开心扉,因此请确保您正在检查它,无论是在您的应用程序中,还是在 SQL 脚本本身中。
-
@Joe 正是我试图尽可能多地参数化的原因。 Where 子句也将完全由参数驱动 - 再加上用户界面没有文本字段,只有复选框和多选列表这一事实,我应该得到很好的覆盖。
-
您不一定信任选择框输入。恶意用户很容易在表单上运行 javascript 来更改那里的值,或者简单地手动发布表单并使用他们想要的值,而不是表单应该限制您的内容。 (这是假设这是一个 Web 应用程序,但同样的概念也适用于 Windows 应用程序,只是略有不同)。因此,请确保您的服务器代码中还有另一层保护。
-
@Joe Right...这也是我想要参数化 SELECT 和 FOR 语句的原因。 Fooey。
标签: c# sql parameters