2012-07-05 22 views
15

Estoy tratando de llenar el DataSet que contiene 2 tablas con una relación de uno a muchos. estoy usando DataReader para lograrlo:¿Cómo llenar el conjunto de datos con varias tablas?

public DataSet SelectOne(int id) 
    { 
     DataSet result = new DataSet(); 
     using (DbCommand command = Connection.CreateCommand()) 
     { 
      command.CommandText = "select * from table1"; 

      var param = ParametersBuilder.CreateByKey(command, "ID", id, null); 
      command.Parameters.Add(param); 

      Connection.Open(); 
      using (DbDataReader reader = command.ExecuteReader()) 
      { 
       result.MainTable.Load(reader); 
      } 
      Connection.Close(); 
     } 
     return result; 
    } 

pero tengo sólo una mesa llena. ¿Cómo logro mi objetivo - llenar ambas tablas?

Me gustaría usar DataReader en lugar de DataAdapter, si es posible.

+3

¿Por qué esperar que dos mesas están llenas? Su comando solo contiene una sola declaración 'select' que devuelve una sola tabla. –

+2

¿Por qué no utilizar un 'SqlDataAdapter' y su método' Fill (...) 'en lugar del' DbCommand'? – bluevector

+0

@Nikola Anusev - Lo sé, así que solo estoy haciendo cualquier tipo de sugerencia –

Respuesta

19

Si emite un comando único con varias sentencias de selección, es posible utilizar el método NextResult a pasar al siguiente conjunto de resultados dentro del datareader: http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult.aspx

muestro cómo podría mirar abajo:

public DataSet SelectOne(int id) 
{ 
    DataSet result = new DataSet(); 
    using (DbCommand command = Connection.CreateCommand()) 
    { 
     command.CommandText = @" 
select * from table1 
select * from table2 
     "; 

     var param = ParametersBuilder.CreateByKey(command, "ID", id, null); 
     command.Parameters.Add(param); 

     Connection.Open(); 
     using (DbDataReader reader = command.ExecuteReader()) 
     { 
      result.MainTable.Load(reader); 
      reader.NextResult(); 
      result.SecondTable.Load(reader); 
      // ... 
     } 
     Connection.Close(); 
    } 
    return result; 
} 
+7

Puedes hacer 'result.Load (reader)'. El método 'Load' manejará múltiples conjuntos de resultados. – AMissico

+0

@AMissico, cierto, pero qué tabla para completar con qué conjunto de resultados no se puede indicar explícitamente con DataSet.Load, se romperá si define las tablas en otro orden. También debe indicar otros parámetros. – smoothdeveloper

+0

me hiciste sonreír hoy. – AMissico

23

Llenar un conjunto de datos wi Las múltiples tablas pueden realizarse enviando múltiples solicitudes a la base de datos, o de una manera más rápida: Se pueden enviar múltiples instrucciones SELECT al servidor de la base de datos en una única solicitud. El problema aquí es que las tablas generadas a partir de las consultas tienen nombres automáticos Tabla y Tabla1. Sin embargo, los nombres de tabla generados se pueden asignar a nombres que se deben usar en el conjunto de datos.

SqlDataAdapter adapter = new SqlDataAdapter(
     "SELECT * FROM Customers; SELECT * FROM Orders", connection); 
adapter.TableMappings.Add("Table", "Customer"); 
adapter.TableMappings.Add("Table1", "Order"); 

adapter.Fill(ds); 
+0

Gracias por la respuesta, pero según mi tarea - Necesito usar DataReader en lugar del adaptador de datos: que fue descrito en mi pregunta –

+3

añadiendo con TableMappings.Add no se neccassarry –

7

Es un viejo tema, pero para algunas personas puede ser útil:

 DataSet someDataSet = new DataSet(); 
     SqlDataAdapter adapt = new SqlDataAdapter(); 

     using(SqlConnection connection = new SqlConnection(ConnString)) 
     { 
      connection.Open(); 
      SqlCommand comm1 = new SqlCommand("SELECT * FROM whateverTable", connection); 
      SqlCommand comm2g = new SqlCommand("SELECT * FROM whateverTable WHERE condition = @0", connection); 
      commProcessing.Parameters.AddWithValue("@0", "value"); 
      someDataSet.Tables.Add("Table1"); 
      someDataSet.Tables.Add("Table2"); 

      adapt.SelectCommand = comm1; 
      adapt.Fill(someDataSet.Tables["Table1"]); 
      adapt.SelectCommand = comm2; 
      adapt.Fill(someDataSet.Tables["Table2"]); 
     } 
+0

cómo puede manejar esta situación, si SQL (proc tienda) volviendo varias tablas ? –

+1

En lugar de hacer 'adapt.Fill (someDataSet.Tables [" Table1 "])' harías 'adapt.Fill (someDataSet)'. Por supuesto, su procedimiento almacenado retrotrae las tablas, pero solo si realmente devuelve TABLAS y no un conjunto de COLUMNAS de múltiples tablas. – CularBytes

+0

Gracias por su respuesta, intentaremos esto :-) –

0
protected void Page_Load(object sender, EventArgs e) 
{ 
    SqlConnection con = new SqlConnection("data source=.;uid=sa;pwd=123;database=shop"); 
    //SqlCommand cmd = new SqlCommand("select * from tblemployees", con); 
    //SqlCommand cmd1 = new SqlCommand("select * from tblproducts", con); 
    //SqlDataAdapter da = new SqlDataAdapter(); 

    //DataSet ds = new DataSet(); 
    //ds.Tables.Add("emp"); 
    //ds.Tables.Add("products"); 
    //da.SelectCommand = cmd; 
    //da.Fill(ds.Tables["emp"]); 
    //da.SelectCommand = cmd1; 

    //da.Fill(ds.Tables["products"]); 
    SqlDataAdapter da = new SqlDataAdapter("select * from tblemployees", con); 
    DataSet ds = new DataSet(); 
    da.Fill(ds, "em"); 
    da = new SqlDataAdapter("select * from tblproducts", con); 
    da.Fill(ds, "prod"); 

    GridView1.DataSource = ds.Tables["em"]; 
    GridView1.DataBind(); 
    GridView2.DataSource = ds.Tables["prod"]; 
    GridView2.DataBind(); 
} 
+0

Por favor, agregue alguna explicación. – gofr1

Cuestiones relacionadas