2011-04-10 72 views
9

¿Cómo puedo agregar valores que SqlDataReader devuelve a una lista genérica? Tengo un método donde utilizo SqlDataReader para obtener CategoryID de una tabla Category. Me gustaría agregar todos los CategoryID una lista genérica.C# - Rellene la lista genérica de SqlDataReader

Esta dosis no funciona porque devuelve solo un categoryID y ese es el último. Quiero agregar todos los categoryID a la lista y luego devolverlos.

¿Cómo puedo hacer eso?

SqlConnection connection = null; 
SqlDataReader reader = null; 
SqlCommand cmd = null; 

try 
{ 
    connection = new SqlConnection(connectionString); 
    cmd = new SqlCommand("select CategoryID from Categories", connection); 

    connection.Open(); 

    List<int> catID = new List<int>(); 
    dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     catID.Add(Convert.ToInt32(dr["CategoryID"].ToString())); 
    } 
} 
finally 
{ 
    if (connection != null) 
     connection.Close(); 
} 
return catID; 
+0

NO llama '.ToString()'. – SLaks

+0

¿Tiene un ** campo ** llamado 'catId'? – SLaks

+0

¡Utilice el uso de instrucciones sobre la conexión, el comando y el lector! – RQDQ

Respuesta

3

su código actual debería funcionar, asumiendo catID es realmente declarado antes del bloque try, de lo contrario no se compilará.

+0

se declara catID. Cuando pruebo mi código solo obtengo un ID de categoría en lugar de cuatro que tengo en mi tabla. – Erik

+2

@Erik: ¿Puede actualizar su código de muestra con el código * real * que está ejecutando, puede que esté renovando la lista cada vez, pero el código anterior no es claramente el que está utilizando actualmente. – BrokenGlass

+0

@Erik - sí, está declarado - justo en el lugar equivocado de arriba. – RQDQ

13

Trate de este tipo, que es mejor, más segura, utiliza la carga diferida, menos código, trabajo, ...:

public IEnumerable<int> GetIds() 
{ 
    using (var connection = new SqlConnection(connectionString)) 
    using (var cmd = connection.CreateCommand()) 
    { 
     connection.Open(); 
     cmd.CommandText = "select CategoryID from Categories"; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       yield return reader.GetInt32(reader.GetOrdinal("CategoryID")); 
      } 
     } 
    } 
} 

y luego:

List<int> catIds = GetIds().ToList(); 
+0

@Darim: Si bien me gusta este código, sería responsabilidad del consumidor llamar 'ToList()'; de lo contrario, tendrías una conexión DB abierta. No estoy convencido de que perezoso sea el enfoque correcto aquí. – BrokenGlass

+2

@BrokenGlass no. la conexión, el lector, todas esas cosas se cierran una vez que se abandona Foreach. Aparte del mérito de esto, un inconveniente sería que la persona que llama tendrá que volver a leer los datos de la base de datos si tiene que volver a utilizar los objetos en el IEnumerable y si no los ha almacenado todos en algún lugar ya. Quiero decir en caso de que no "foreach" completamente. Con 'ToList()' ya los tienes en alguna parte ... – nawfal

+0

'GetOrdnal' realmente no es necesario, especialmente cuando la consulta es una sola columna como esta,' reader.GetOrdinal ("CategoryID") 'solo puede reemplazarse con' 0 ' –

1

AS BrokenGlass explicó esto es la demostración

SqlConnection connection = null; 
     SqlDataReader dr= null; 
     SqlCommand cmd = null; 
List<int> catID = new List<int>(); 
     try 
     { 
      connection = new SqlConnection(connectionString); 
      cmd = new SqlCommand("select CategoryID from Categories", connection); 

      connection.Open(); 



      dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       catID.Add(Convert.ToInt32(dr["CategoryID"].ToString())); 
      } 


     } 
     finally 
     { 
      if (connection != null) 
       connection.Close(); 
     } 
     return catID; 

, así como cambia la declaración

SqlDataReader reader = null; 

a

SqlDataReader dr= null; // Because you are using dr in the code not reader 
0

Esto debería funcionar, pero yo sugeriría que usted utilice using con su connections

SqlConnection connection = null; 
    SqlDataReader reader = null; 
    SqlCommand cmd = null; 
    List<int> catID = new List<int>(); 
    try 
    { 
     connection = new SqlConnection(connectionString); 
     cmd = new SqlCommand("select CategoryID from Categories", connection); 

     connection.Open(); 



     dr = cmd.ExecuteReader(); 
     while (dr.Read()) 
     { 
      catID.Add(Convert.ToInt32(dr["CategoryID"].ToString())); 
     } 


    } 
    finally 
    { 
     if (connection != null) 
      connection.Close(); 
    } 
    return catID; 
0
 List<int> s = new List<int>(); 
     conn.Open(); 
     SqlCommand command2 = conn.CreateCommand(); 
     command2.CommandText = ("select turn from Vehicle where Pagged='YES'"); 
     command2.CommandType = CommandType.Text; 
     SqlDataReader reader4 = command2.ExecuteReader(); 
     while (reader4.Read()) 
     { 
      s.Add(Convert.ToInt32((reader4["turn"]).ToString())); 
     } 
     conn.Close(); 
Cuestiones relacionadas