read oracledatareader executereader example ejemplos data c# sql ado.net dataset datareader

c# - oracledatareader - ¿Cómo llenar Dataset con varias tablas?



sqldatareader c# ejemplos (8)

El método Load of DataTable ejecuta NextResult en el DataReader , por lo que no debe llamar a NextResult explícitamente al usar Load , de lo contrario incluso las tablas podrían perderse.

Aquí hay una solución genérica para cargar varias tablas usando un DataReader .

// your command initialization code here // ... DataSet ds = new DataSet(); DataTable t; using (DbDataReader reader = command.ExecuteReader()) { while (!reader.IsClosed) { t = new DataTable(); t.Load(rs); ds.Tables.Add(t); } }

Estoy tratando de llenar DataSet que contiene 2 tablas con una o muchas relaciones. Estoy usando DataReader para lograr esto:

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 solo tengo una mesa llena. ¿Cómo logro mi objetivo: llenar ambas tablas?

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


Es un tema antiguo, pero para algunas personas podría 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"]); }


Se puede llenar un conjunto de datos con varias tablas enviando varias solicitudes a la base de datos, o de una manera más rápida: se pueden enviar múltiples declaraciones SELECT al servidor de la base de datos en una sola 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 tablas generados pueden asignarse a nombres que deben usarse en el DataSet.

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


Si está emitiendo un solo comando con varias declaraciones de selección, puede usar el método NextResult para pasar al siguiente conjunto de resultados dentro del datareader: http://msdn.microsoft.com/en-us/library/system.data.idatareader.nextresult.aspx

Os muestro cómo podría verse a continuación:

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; }



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(); }


public DataSet GetDataSet() { try { DataSet dsReturn = new DataSet(); using (SqlConnection myConnection = new SqlConnection(Core.con)) { string query = "select * from table1; select* from table2"; SqlCommand cmd = new SqlCommand(query, myConnection); myConnection.Open(); SqlDataReader reader = cmd.ExecuteReader(); dsReturn.Load(reader, LoadOption.PreserveChanges, new string[] { "tableOne", "tableTwo" }); return dsReturn; } } catch (Exception) { throw; } }


string connetionString = null; SqlConnection connection ; SqlCommand command ; SqlDataAdapter adapter = new SqlDataAdapter(); DataSet ds = new DataSet(); int i = 0; string firstSql = null; string secondSql = null; connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"; firstSql = "Your First SQL Statement Here"; secondSql = "Your Second SQL Statement Here"; connection = new SqlConnection(connetionString); try { connection.Open(); command = new SqlCommand(firstSql, connection); adapter.SelectCommand = command; adapter.Fill(ds, "First Table"); adapter.SelectCommand.CommandText = secondSql; adapter.Fill(ds, "Second Table"); adapter.Dispose(); command.Dispose(); connection.Close(); //retrieve first table data for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) { MessageBox.Show(ds.Tables[0].Rows[i].ItemArray[0] + " -- " + ds.Tables[0].Rows[i].ItemArray[1]); } //retrieve second table data for (i = 0; i <= ds.Tables[1].Rows.Count - 1; i++) { MessageBox.Show(ds.Tables[1].Rows[i].ItemArray[0] + " -- " + ds.Tables[1].Rows[i].ItemArray[1]); } } catch (Exception ex) { MessageBox.Show("Can not open connection ! "); }