C#SQLCommand添加参数返回'无效的对象名称'@table'

时间:2019-08-31 03:41:53

标签: c# sql

我正在处理C#DB项目,当我尝试向命令文本中添加参数时,总是出现此错误。

  

“无效的对象名称'@table'。”

我添加的每个参数都会出现此错误。

sqlcmd.CommandText = "INSERT INTO [@table](@iVar, @uVar, @pVar) VALUES (@vali, @val1, @val2)";

sqlcmd.Parameters.AddWithValue("@table", "Data");
sqlcmd.Parameters.AddWithValue("@iVar", "Var1");
sqlcmd.Parameters.AddWithValue("@uVar", "Var2");
sqlcmd.Parameters.AddWithValue("@pVar", "Var3");
sqlcmd.Parameters.AddWithValue("@vali", "Val1");
sqlcmd.Parameters.AddWithValue("@val1", "Val2");
sqlcmd.Parameters.AddWithValue("@val2", "Val3");

sqlcmd.ExecuteNonQuery();

2 个答案:

答案 0 :(得分:1)

表名和列名不能作为参数传递给SQL命令。但是,您可以使用以下内容。

var tableName = "Data";
var iVar = "Var1";
var uVar = "Var2";
var pVar = "Var3";
sqlcmd.CommandText = $"INSERT INTO [{tableName}]({iVar}, {uVar}, {pVar}) VALUES (@vali, @val1, @val2)";

sqlcmd.Parameters.AddWithValue("@vali", "Val1");
sqlcmd.Parameters.AddWithValue("@val1", "Val2");
sqlcmd.Parameters.AddWithValue("@val2", "Val3");

sqlcmd.ExecuteNonQuery();

请注意,$用于string interpolation

然后,您必须确保将tableNameiVaruVarpVar列入白名单,以避免发生任何形式的SQL注入攻击如果您从最终用户那里获取此值。

答案 1 :(得分:0)

表名必须是静态的。如果要通过某种形式的用户输入获取表名,则需要对其进行验证。您可以使用存储过程执行以下操作:

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from tablename'
EXEC (@sqlCommand)

或类似的

SELECT @sSQL = N'SELECT * FROM' + QUOTENAME(@TableName);
EXEC sp_executesql @sSQL