我正在尝试使用以下代码:
String connStr = sqlRoutines.connectionString;
SqlConnection sqlConn = new SqlConnection(connStr);
sqlConn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM TABEL=@tabel";
cmd.Parameters.Add("@tabel", SqlDbType.Text).Value = DataContainer.sqlTabel;
SqlDataReader reader = cmd.ExecuteReader();
Console.WriteLine(reader.FieldCount.ToString());
reader.Close();
sqlConn.Close();
不知何故,值“DataContainer.sqlTabel”未添加到命令中。我在这里错过了什么吗?
每当我使用cmd.CommandText = "SELECT * FROM" + DataContainer.sqlTabel;
时,一切正常。但是,由于SQL注入,我想避免使用此方法。
提前致谢!
编辑:
我想实现一个使用变量的命令(由用户更改)。所以我想要这样的事情:SELECT * FROM * a variable defined by the use *;
。当我使用时:
cmd.CommandText = "SELECT * FROM @tablename";
cmd.Parameters.Add("@tablename", SqlDbType.Text).Value = DataContainer.sqlTabel;
它不起作用。
答案 0 :(得分:0)
我们不能使用表名或列名的参数。参数仅限于值。如果要使用表名参数,则必须创建存储过程,然后将表名作为参数传递给存储过程。更多信息可以在这里找到
答案 1 :(得分:0)
我认为您尝试参数化无法的表名。我也不明白TABEL
是什么。 FROM
(Transact-SQL)没有这样的语法。
您只能参数化值。不是表名或列名。将表名指定为SQL的一部分。但是当你这样做时,你需要对表名进行非常强大的验证才能将它放入SQL中,或者有一组列入白名单的有效表名,以避免SQL injection攻击。
如果您真的想要参数化它,可以使用(但不推荐)动态SQL。
正如我们所看到的,我们可以在动态的帮助下使这个程序工作 SQL,但也应该清楚我们没有获得任何优势 在存储过程中生成动态SQL。你可以 以及从客户端发送动态SQL。那么,好的:1)如果SQL 声明非常复杂,你可以节省一些网络流量 封装。 2)正如我们所看到的,从SQL 2005开始有 处理权限的方法。 然而,这是个坏主意。
还可以使用using
statement来处置数据库连接。
using(SqlConnection sqlConn = new SqlConnection(connStr))
using(SqlCommand cmd = sqlConn.CreateCommand())
{
...
...
using(SqlDataReader reader = cmd.ExecuteReader())
{
...
}
}
答案 2 :(得分:0)
你不能这样做。您只能使用动态SQL。您需要自己决定SQL注入是否存在风险,如果是这样,您需要为此编写代码,或者检查表的值是否包含除有效表名之外的任何内容。您可以根据系统表检查表名,以确保它有效。