如何创建LINQ语句,其中表名(FROM)和列名(SELECT)是可变的?

时间:2012-05-11 12:24:06

标签: asp.net sql-server vb.net linq-to-sql webforms

在我的编程任务中,我走下了一条黑暗的小巷,并希望我没有,但现在没有回头。

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

但它没有看起来那么糟糕,我受到保护:

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

字段值应该是NVARCHAR(4000)或NVARCHAR(MAX)类型,所以我要避免ExecuteScalar而我正在尝试LINQ ExecuteQuery,因为我喜欢LINQ。但是我有点超出了我的深度。

我到目前为止:

    Dim db As New MyDataContext

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

P.S。这是一个SQL Server 2005数据库

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

1 个答案:

答案 0 :(得分:1)

SQL Server要求静态地知道表和列。您无法使用命令参数提供它们。你不能说

select * from @tableName

因为表名不能是变量。

您需要使用C#构建SQL字符串,以确保正确转义标识符。逃避的工作方式如下:

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

这是安全的。