0

在我的编程任务中,我走上了一条黑暗的小巷,但愿我没有,但现在没有回头路了。

我正在构建一个 SQL 语句,其中从查询字符串参数中检索表名、列名和 id 值,即("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)

但它并不像看起来那么糟糕,我受到保护:

  • 只有经过身份验证的用户(即登录用户)才能执行Page_Load
  • 我正在检查表和列是否都存在(使用GetSchema等)
  • 我正在检查 Id 是否是一个整数
  • 我所有的表都有 Id 列
  • 数据库连接相当安全

字段值应为 NVARCHAR(4000) 或 NVARCHAR(MAX) 类型,因此我避免使用ExecuteScalarLINQ ExecuteQuery,因为我喜欢 LINQ。但我又有点超出我的深度了。

我已经做到了这一点:

    Dim db As New MyDataContext

    Dim result = db.ExecuteQuery(Of ITable)("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)
  • 这是正确的方法吗?
  • 如何获得第一行和第一列的值?
  • 有更好的选择吗?

PS 这是一个 SQL Server 2005 数据库

任何帮助表示赞赏。谢谢。

4

1 回答 1

1

SQL Server 要求表和列是静态已知的。您不能使用命令参数提供它们。你不能说

select * from @tableName

因为表名不能是变量。

您需要使用 C# 构建 SQL 字符串,以确保正确转义标识符。转义是这样的:

var escaped = "[" + rawUntrustedUserInput.Replace("]", "]]") + "]";

这是安全的。

于 2012-05-11T18:20:47.427 回答