SqlParameter C#上的表名和表字段?

15 .net c# sql

我想知道如何通过C#上的SqlCommand传递表名和表字段名.

尝试通过使用@符号设置SqlCommand但不起作用来完成它.有任何想法吗??

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不能在字段名或表名上有参数,只能在值上.

如果我的猜测不正确,请扩展您的问题.


Bri*_*ian 5

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的更多信息.