我正在处理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();
答案 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
然后,您必须确保将tableName
,iVar
,uVar
和pVar
列入白名单,以避免发生任何形式的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