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



我正在处理一个 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();

表名和列名不能作为参数传递给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();

请注意,$用于字符串插值

然后,您必须确保将tableNameiVaruVarpVar列入白名单,以避免从最终用户获取此值时任何类型的SQL注入攻击。

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

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

或类似的东西

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

最新更新