string sql = "delete from @tabelnaam";
SqlCommand sc = new SqlCommand();
sc.Connection = getConnection();
sc.CommandType = CommandType.Text;
sc.CommandText = sql;
SqlParameter param = new SqlParameter();
param.Direction = ParameterDirection.Input;
param.ParameterName = "@tabelnaam";
param.Value = tableName;
sc.Parameters.Add(param);
OpenConnection(sc);
sc.ExecuteScalar();
tableName提供给此函数。
我得到例外:
Must declare the table variable @tabelnaam
答案 0 :(得分:3)
IIRC,你不能用表名代替参数。
而是构建包含正确表名的SQL字符串。
答案 1 :(得分:1)
进行更改
而不是使用参数使用此
string sql = string.format( "delete from {0}",tableName);
使用executenonquery而不是ExecuteScalar
sc.ExecuteNonQuery();
答案 2 :(得分:1)
如其他人所述,您无法对表名进行参数化。
但是,正如你在其他答案的评论中正确提到的那样,使用简单的字符串操作可能会引入SQL注入风险:
如果您的表名输入来自不受信任的来源,例如用户输入,则使用此:
string sql = string.format( "DELETE FROM {0}",tableName);
让你打开表格名称“myTable; DROP DATABASE MyDb”,为你提供:
DELETE FROM myDb; DROP DATABASE MyDB
这样做的方法是将表名分隔为这样的内容:
string sql = string.format("DELETE FROM dbo.[{0}]", tableName);
与结合使用,检查输入是否包含'['或']';您可能应该检查它也不包含任何其他不能用作表名的字符,例如句点和引号。
答案 3 :(得分:0)
我认为你不能参数化表名。根据我的阅读,您可以通过Dynamic sql和调用sp_ExecuteSQL来完成。
答案 4 :(得分:0)
您的SQL不正确,您正在从表变量中删除但尚未定义该变量。
更新:正如有人指出的那样,您正在尝试动态构建查询字符串,但却无意中使用了SQL参数(这些参数不作为字符串文字的占位符)。
答案 5 :(得分:0)
答案 6 :(得分:0)
您无法对表名进行参数化,您必须将其注入命令文本。
您可以而且应该做的是通过分隔名称来保护自己免受SQL注入:
public static string Delimit(string name) {
return "[" + name.Replace("]", "]]") + "]";
}
// Construct the command...
sc.CommandType = CommandType.Text;
sc.CommandText = "delete from " + Delimit(tableName);
sc.ExecuteNonQuery();