在c#中向SQLcommand添加参数

时间:2014-08-28 10:15:00

标签: c# sql

我正在尝试使用以下代码:

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;

它不起作用。

3 个答案:

答案 0 :(得分:0)

我们不能使用表名或列名的参数。参数仅限于值。如果要使用表名参数,则必须创建存储过程,然后将表名作为参数传递给存储过程。更多信息可以在这里找到

Table name as parameter

答案 1 :(得分:0)

我认为您尝试参数化无法的表名。我也不明白TABEL是什么。 FROM (Transact-SQL)没有这样的语法。

您只能参数化。不是表名或列名。将表名指定为SQL的一部分。但是当你这样做时,你需要对表名进行非常强大的验证才能将它放入SQL中,或者有一组列入白名单的有效表名,以避免SQL injection攻击。

如果您真的想要参数化它,可以使用(但不推荐)动态SQL。

SELECT * FROM @tablename

  

正如我们所看到的,我们可以在动态的帮助下使这个程序工作   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注入是否存在风险,如果是这样,您需要为此编写代码,或者检查表的值是否包含除有效表名之外的任何内容。您可以根据系统表检查表名,以确保它有效。