执行参数化查询后,参数是否会从ParameterCollection中删除?

时间:2015-08-12 17:17:53

标签: c# sql-injection sql-parametrized-query

我的方法中有很多查询。根据条件,执行特定查询。每个查询都使用相同的参数。

例如:

public static void Method(param1, param2, param3)
{
   ....
   cmd.CommandType = CommandType.Text;
   if(Condition1)
   {
      cmd.CommandText = "select * from Table1 where id=@id"
      cmd.Parameters.AddWithValue("@id", param1);
      cmd.ExecuteNonQuery();

      foreach(int i in IntegerList)
      {
          ....
          cmd.CommandText = "insert into Table2(id,type,model) values(@id,@type,@model)
          cmd.Parameters.AddWithValue("@id", param1);
          cmd.ExecuteNonQuery();
          ....       
      }
   }
   else
   {
      cmd.CommandText="select * from Table3 where id = @id"
      cmd.Parameters.AddWithValue("@id", param1);   
      SqlDataAdapter da = new SqlDataAdapter();
      da.SelectCommand = cmd;
      DataSet ds = new DataSet();
      da.Fill(ds);
      cmd.Dispose();
      da.Dispose();
      ....
   }
   cmd.CommandText = "delete from Table3 where id = @id and model=@model..."
   ....

}

如果我每次需要执行不同的查询时都继续添加参数@id,我的问题是会出现错误,或者在查询执行后我的参数会被删除吗?

2 个答案:

答案 0 :(得分:1)

您应该添加带有类型的参数,然后在需要时设置其值。这将确保类型始终正确。

话虽这么说,执行后参数不会被删除,如果密钥已经存在,AddWithValue似乎不会抛出异常,这与之前的Add不同。所以你应该能够再次添加参数。

当然,如果值相同且只有查询更改,则无需再次添加。

答案 1 :(得分:0)

首先使用所有参数准备命令对象,然后在循环中分配新值。

command.Parameters.Add("@id", SqlDbType.Int);
foreach (...) {
    command.Parameters["@id"].Value = param1; 
    command.ExecuteNonQuery();
}