我迷路了:这个ado.net代码出了什么问题?

时间:2010-06-24 10:40:08

标签: c# ado.net

好吧,问题很清楚我希望,代码是这样的:

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

7 个答案:

答案 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();

有关更多背景信息,请参阅herehere