2010-01-28 13 views
11

Después de algunos tutoriales y como yo era capaz de crear con éxito una clase de colección que hereda la funcionalidad necesaria para crear un DataTable que se pueden pasar a un procedimiento almacenado del servidor Sql como un parámetro de valor de tabla. Todo parece estar funcionando bien; Puedo agregar todas las filas y se ve hermosa. Sin embargo, tras una inspección más cercana noté que cuando agrego una nueva fila, los datos de todas las filas anteriores se sobrescriben con el valor de la nueva fila. Entonces, si tengo una fila con un valor de cadena de "foo" y agrego una segunda fila con el valor "barra", se insertará la segunda fila (haciendo una DataTable con dos filas) pero ambas filas tendrán el valor "bar" ". ¿Alguien puede ver por qué sería esto? Aquí hay parte del código, que funciona pero ha sido un poco simplificado (la clase Tag se ha reducido para facilitar la explicación).¿Por qué añadir un nuevo valor a la lista <> sobrescribir los valores anteriores en la lista <>

El siguiente es de la clase de colección:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using Microsoft.SqlServer.Server; 

namespace TagTableBuilder 
{ 
public class TagCollection : List<Tag>, IEnumerable<SqlDataRecord> 
{ 
    IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator() 
    { 
     var sdr = new SqlDataRecord(
      new SqlMetaData("Tag", SqlDbType.NVarChar) 
      ); 

     foreach (Tag t in this) 
     { 
      sdr.SetSqlString(0, t.tagName); 

      yield return sdr; 
     } 
    } 
} 

public class Tag 
{ 
    public string tagName { get; set; } 
} 
} 

Estos se denominan de la siguiente manera:

//Create instance of collection 
TagCollection tags = new TagCollection(); 

//Create instance of object 
Tag _tag = new Tag(); 

foreach (string t in tagList) 
{ 
    //Add value to class propety 
    _tag.tagName = t; 
    //Add class to collection, this is where all previously added rows are overwritten 
    tags.Add(_tag); 
} 
+0

Sí debería voy a arreglar eso hasta gracias! –

Respuesta

25

Usted está utilizando la misma instancia del objeto Tag dentro del bucle, por lo que cada actualización de el tagName es para la misma referencia. Mover la declaración dentro del bucle para obtener un objeto fresca en cada pasada del bucle:

foreach (string t in tagList) 
{ 
    Tag _tag = new Tag(); 

    //Add value to class propety 
    _tag.tagName = t; 
    //Add class to collection, this is where all previously added rows are overwritten 
    tags.Add(_tag); 
} 

Observe también que he actualizado la última línea añadir _tag en lugar de mTag como yo no veo esto define en cualquier lugar.

2

En el bucle donde se añaden las etiquetas a la colección, que está utilizando la misma instancia de objeto de etiqueta. Básicamente, está configurando el nombre de una Etiqueta para el primer valor en tagList y agregándolo a la colección, luego está cambiando el nombre de esa misma Etiqueta por el segundo valor en tagList y lo vuelve a agregar a la colección.

Su colección de etiquetas contiene varias referencias al mismo objeto Tag! Cree una instancia de _tag dentro del bucle for cada vez antes de configurar el nombre de la etiqueta y agregarla a la colección.

Cuestiones relacionadas