在我的编程任务中,我走下了一条黑暗的小巷,并希望我没有,但现在没有回头。
我正在构建一个SQL语句,其中从查询字符串参数中检索表名,列名和id值,即("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)
但它没有看起来那么糟糕,我受到保护:
Page_Load
GetSchema
等。)字段值应该是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数据库
任何帮助表示赞赏。 感谢。
答案 0 :(得分:1)
SQL Server要求静态地知道表和列。您无法使用命令参数提供它们。你不能说
select * from @tableName
因为表名不能是变量。
您需要使用C#构建SQL字符串,以确保正确转义标识符。逃避的工作方式如下:
var escaped = "[" + rawUntrustedUserInput.Replace("]", "]]") + "]";
这是安全的。