我在Visual Studio中为此部分代码收到此错误。为什么?我确实在下面将@TableName
声明为FormField。
必须声明表变量" @ TableName"。
代码:
using (SqlCommand sqlCmd2 = new SqlCommand())
{
sqlCmd2.Connection = sqlConn2;
sqlCmd2.CommandType = System.Data.CommandType.Text;
sqlCmd2.CommandText = string.Format("SELECT DisplayName AS MyColumn FROM @TableName WHERE EventId = 1 AND Visible = 1");
sqlCmd2.Parameters.Add("@TableName", SqlDbType.NVarChar).Value = "FormField";
sqlCmd2.ExecuteNonQuery();
}
答案 0 :(得分:3)
使用参数无法解析表名。为此,您必须在转到SqlCommand
时准备您的陈述:
string tableName = "FormField";
using (SqlCommand sqlCmd2 = new SqlCommand())
{
sqlCmd2.Connection = sqlConn2;
sqlCmd2.CommandType = System.Data.CommandType.Text;
sqlCmd2.CommandText = string.Format("SELECT DisplayName AS MyColumn FROM {0} WHERE EventId = 1 AND Visible = 1", tableName );
sqlCmd2.ExecuteNonQuery();
}
SqlParameter
只能用于传递参数。例如。在插入或更新语句中。但是如果你想这样做,请确保不能从源代码外部更改tableName
以防止在任何情况下进行sql注入。您可以在执行任何查询之前过滤可接受的值。
答案 1 :(得分:1)
您不能将表名(或列名或函数或运算符)指定为参数。
因此,在您的查询中,@TableName
被解释为表变量,而不是参数,并且未定义表变量。
唉,你需要使用字符串操作显式地放置表。