title: The SqlParameter is already contained by another SqlParameterCollection - Does using() {} cheat?
body: <p>While using the <code>using() {}</code> (sic) blocks as shown below, and assuming that <code>cmd1</code> does not live beyond the scope of the first <code>using() {}</code> block, why should the second block throw an exception with the message </p>
  
  <blockquote>
    <p>The SqlParameter is already contained by another SqlParameterCollection</p>
  </blockquote>
  
  <p>Does it mean that resources and/or handles - including the parameters (<code>SqlParameterCollection</code>) - attached to <code>cmd1</code> are not released when its destroyed at the end of the block?</p>
  
  <pre><code>using (var conn = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
  {
      var parameters = new SqlParameter[] { new SqlParameter("@ProductId", SqlDbType.Int ) };
  
      using(var cmd1 = new SqlCommand("SELECT ProductName FROM Products WHERE ProductId = @ProductId"))
      {
          foreach (var parameter in parameters)
          {
              cmd1.Parameters.Add(parameter);                
          }
          // cmd1.Parameters.Clear(); // uncomment to save your skin!
      }
  
      using (var cmd2 = new SqlCommand("SELECT Review FROM ProductReviews WHERE ProductId = @ProductId"))
      {
          foreach (var parameter in parameters)
          {
              cmd2.Parameters.Add(parameter);
          }
      }
  }
  </code></pre>
  
  <p><strong>NOTE:</strong> Doing cmd1.Parameters.Clear() just before the last brace of the first <strong>using() {}</strong> block will save you from the exception (and possible embarrassment).</p>
  
  <p>If you need to reproduce you can use the following scripts to create the objects:</p>
  
  <pre><code>CREATE TABLE Products
  (
      ProductId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
      ProductName nvarchar(32) NOT NULL
  )
  GO
  
  CREATE TABLE ProductReviews
  (
      ReviewId int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
      ProductId int NOT NULL,
      Review nvarchar(128) NOT NULL
  )
  GO
  </code></pre>