Cra*_*gis 20
如果您担心SQL注入,SqlCommandBuilder类(以及其他特定于DB的DbCommandBuilder版本)都有一个名为QuoteIdentifier的函数,它将正确地转义您的表名.
var builder = new SqlCommandBuilder();
string escTableName = builder.QuoteIdentifier(tableName);
Run Code Online (Sandbox Code Playgroud)
现在,您可以在构建语句时使用转义值,而不必担心注入 - 但您仍应使用任何值的参数.
Han*_*ing 10
我想你正在尝试执行一个类似的SQL语句
select @field from @table
Run Code Online (Sandbox Code Playgroud)
但那不行.Sql不能在字段名或表名上有参数,只能在值上.
如果我的猜测不正确,请扩展您的问题.
SqlCommand参数只能用于传递数据.您不能使用它们来修改sql语句(例如向select语句添加其他字段).如果你需要修改sql语句,我建议使用StringBuilder来创建tsql语句.
为了进一步说明,.Net在将sql发送到SqlServer之前不会连接它(至少不是你想象的直接方式).它实际上调用存储过程并单独传递参数.这允许Sql Server缓存查询计划并优化tsql的性能.
如果你要编写这个SqlCommand ...
var cmd = new SqlCommand("SELECT * FROM MyTable WHERE MyID = @MyID", conn);
cmd.Parameters.AddWithValue("@MyID", 1);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
这是发给Sql Server的tsql ...
exec sp_executesql N'SELECT * FROM MyTable WHERE MyID = @MyID',N'@MyID int',@MyID=1
Run Code Online (Sandbox Code Playgroud)
您可以在MSDN上阅读有关sp_executesql的更多信息.
归档时间: |
|
查看次数: |
6657 次 |
最近记录: |