Llenar un DataSet con varias tablas

07/03/2006 - 20:35 por Lucas | Informe spam
Buenas Tardes

¿Alguien podría decirme cómo hago para llenar varias tablas en un solo
DataSet?, estas tablas se encuentran en una misma base de datos.

He buscado información sobre el tema y en todos los link's que he encontrado
dice que si se puede, pero intenté usar un único DataAdapter para hacerlo,
pero al final, al parecer, por el error que me sale, todas las tablas quedan
con alguno de los campos de la última tabla que llené. Esto lo digo porque
cuando intento actualizar una de las primeras tablas que agrego al DataSet me
sale un mensaje que dice que tengo que llenar un campo que es obligatorio en
la última tabla, pero ese campo no forma parte de la tabla que intento
actualizar.

¿Es que antes de poder cambiar la sentencia SQL que uso para seleccionar los
datos que cada tabla debo asignar al DataAdapter un valor nothing o algo asi,
o es que debo usar un DataAdapter por cada Tabla?

Preguntas similare

Leer las respuestas

#1 Jesús López
09/03/2006 - 17:55 | Informe spam
La solución es usar un DataAdapter para cada datatable:

Algo así:

Dim Adapter1 As New SqlDataAdapter("select * from tabla1", conexión)
Dim Adapter2 As New SqlDataAdapter("select * from tabla2", conexión)

Dim ds As New DataSet()

Adapter1.Fill( ds, "tabla1")
Adapter2.Fill(ds, "tabla2")

Saludos:

Jesús López
MVP


"Lucas" escribió en el mensaje
news:
Buenas Tardes

¿Alguien podría decirme cómo hago para llenar varias tablas en un solo
DataSet?, estas tablas se encuentran en una misma base de datos.

He buscado información sobre el tema y en todos los link's que he
encontrado
dice que si se puede, pero intenté usar un único DataAdapter para hacerlo,
pero al final, al parecer, por el error que me sale, todas las tablas
quedan
con alguno de los campos de la última tabla que llené. Esto lo digo porque
cuando intento actualizar una de las primeras tablas que agrego al DataSet
me
sale un mensaje que dice que tengo que llenar un campo que es obligatorio
en
la última tabla, pero ese campo no forma parte de la tabla que intento
actualizar.

¿Es que antes de poder cambiar la sentencia SQL que uso para seleccionar
los
datos que cada tabla debo asignar al DataAdapter un valor nothing o algo
asi,
o es que debo usar un DataAdapter por cada Tabla?

Respuesta Responder a este mensaje
#2 jonathan-242
22/05/2012 - 00:56 | Informe spam
Lucas escribió el 07/03/2006 20:35 :
Buenas Tardes

¿Alguien podría decirme cómo hago para llenar varias
tablas en un solo
DataSet?, estas tablas se encuentran en una misma base de datos.

He buscado información sobre el tema y en todos los link's que he
encontrado
dice que si se puede, pero intenté usar un único DataAdapter para
hacerlo,
pero al final, al parecer, por el error que me sale, todas las tablas quedan
con alguno de los campos de la última tabla que llené. Esto lo
digo porque
cuando intento actualizar una de las primeras tablas que agrego al DataSet me
sale un mensaje que dice que tengo que llenar un campo que es obligatorio en
la última tabla, pero ese campo no forma parte de la tabla que intento
actualizar.

¿Es que antes de poder cambiar la sentencia SQL que uso para seleccionar
los
datos que cada tabla debo asignar al DataAdapter un valor nothing o algo asi,
o es que debo usar un DataAdapter por cada Tabla?


Hola claro que si se puede llenar un DataSet con las tablas que gustes de una BD sin saber el nombre de dichas tablas:

1.- Debemos Formar nuestra cadena de conexión en tiempo de ejecución para lo cual utilizaremos el siguiente código que insertaremos en el Load de nuestra aplicación:

//este método cargara a un ComboBox las instancias de SQL que tengamos instaladas en nuestra computadora, y si tenemos por default la instancia (local) automáticamente traerá todas las bases de datos contenidas en esa instancia y las agregara a otro combo.

private void Form1_Load(object sender, EventArgs e) {

this.Text = "Monitoreo de Tablas";
// Las instancias de SQL Server que hay instaladas
string[] instancias;
instancias = instanciasInstaladas();
foreach(string s in instancias){
if( s == "MSSQLSERVER" ){
cboInstancias.Items.Add("(local)");
}else{
cboInstancias.Items.Add(@"(local)\" + s);
}
}
cboInstancias.Text = "(local)";

// Los nombres de las bases de datos
string[] bases = basesDeDatos("(local)");
if( bases != null ){
this.cboBases.Items.AddRange(bases);
}
if( this.cboBases.Items.Count > 0 ){
this.cboBases.SelectedIndex = 0;
}

}

//método que obtiene las instancias:

private String[] instanciasInstaladas() {
Microsoft.Win32.RegistryKey rk;
rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\Microsoft SQL Server", false);
string[] s;
s = ((String[])rk.GetValue("InstalledInstances"));
return s;
}

//hasta este momento ya tenemos nuestro servidor SQL y las Bases de datos que maneja, ahora cargaremos las tablas contenidas en la base de datos que hallamos seleccionado, para esto ocupo un metodo sobrecargado:

private void conectar(string opc) //obtiene todas las tablas de la BD seleccionada
{
sCnn = "Server=" + cboInstancias.Text + "; " + "database=" + cboBases.Text + "; integrated security=yes";

SqlConnection cnn = new SqlConnection(sCnn);

// La cadena de selección
string sSel = "select substring(name, 1, 50) as Tabla from sysobjects where xtype = 'u'";

//
// Comprobar si hay algún error
try
{
// Crear un nuevo objeto del tipo DataAdapter
da = new SqlDataAdapter(sSel, sCnn);
// Esta base de datos usa el ID con valores automáticos
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
//
dt = new DataTable();
// Llenar la tabla con los datos indicados
da.Fill(dt);
if (opc == "1")
{
dgtablaoriginal.DataSource = null;
dgtablaoriginal.Rows.Clear();
dgtablaoriginal.DataSource = dt;
//gvtablas1.DataSource = null;
//gvtablas1.Rows.Clear();
//gvtablas1.DataSource = dt;
}
//else if (opc == "2")
//{
// gvtablas2.DataSource = null;
// gvtablas2.Rows.Clear();
// gvtablas2.DataSource = dt;
//}

}
catch (Exception ex)
{
MessageBox.Show("ERROR al conectar o recuperar los datos:\n" +
ex.Message, "Conectar con la base",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

//el siguiente codigo lo insertamos en un boton para ejecutar las consulta a la BD

private void btnConectar_Click(object sender, EventArgs e)
{
conectar("1");
//agregamos las columnas al grid para su seleccion

for (int i = 0; i <= dgtablaoriginal.RowCount - 1; i++ )
{
dgtablas.Rows.Add(dgtablaoriginal.Rows[i].Cells[0].Value.ToString(), false);
}


}

//para que todo funcione correctamente debemos de tener dos DataGridView los nombres aparecen en el código, el grid "dgtablaoriginal" contiene la consulta original solo el nombre de las tablas y en el grid dgtablas le agrege dos columnas una donde va a llevar el nombre y otra una comlumna de tipo Chek para seleccionar dinamicamente las tablas que nececitemos, una vez teniendo eso ya tendremos la lista de las tablas contenidas en la BD seleccionada y procedemos a cargar las X tablas seleccionadas al DataSet.

public void Llenar_DataSet() //Metodo que creara todas las centencias SQL de acuerdo a las tablas que halla seleccionado.
{
//creamos un ciclo para recorrer la tabla y saber que tablas hay que seleccionar
dataSet = new DataSet("BD");

for (int i = 0; i <= dgtablas.RowCount - 1; i++)
{
if (Convert .ToBoolean (dgtablas.Rows[i].Cells[1].Value) == true)
{

Query = "select * from " + dgtablas.Rows[i].Cells[0].Value.ToString();
SqlDataAdapter adaptador = new SqlDataAdapter();
adaptador .TableMappings .Add ("Table",dgtablas.Rows[i].Cells[0].Value.ToString());
conn = new SqlConnection(sCnn);
conn .Open();
SqlCommand command = new SqlCommand(Query,conn);
command.CommandType = CommandType.Text;
adaptador .SelectCommand =command ;
// Fill the DataSet.
adaptador.Fill(dataSet);
conn.Close();
//ya tenemos las tablas seleccionadas en un DatSet
}

}

}

una vez terminado de ejecutar este método ya tendremos todas las tablas cargadas en nuestro DataSet para ser accedidas en cualquier momento tal y como lo muestro a continuación.
este código manda a traer otro método que busca diferencias entre las tablas, la finalidad de mi código es hacer una copia de "X" tabla y después de ser modificada por una aplicación detectar que cambios sufrió dicha tabla haciando una consulta en ese momento.

private void btniniciar_Click(object sender, EventArgs e)
{
//aqui tenemos que iniciar el recorrido por cada tabla que halla seleccionado el cliente.
//primero debemos de llenar la primera tabla cargada al dataset para despues compararla con los datos actuales
//la primera tabla sera la primera que fue seleccionada por el cliente
for (int i = 0; i <= dgtablas.RowCount - 1; i++)
{
if (Convert.ToBoolean(dgtablas.Rows[i].Cells[1].Value) == true)
{
grid_1.DataSource = null;
grid_1.Rows.Clear();
grid_1.DataSource = dataSet.Tables[dgtablas.Rows[i].Cells[0].Value.ToString()]; //Asignamos los datos de la tabla correspondiente
//tenemos que llenar la segundo grid con los datos Actuales de la BD para despues ejecutar el algoritmo que buscara las diferencias
conectar("2", dgtablas.Rows[i].Cells[0].Value.ToString());
//mandamos a llamar el metodo de busqueda de diferencias
BuscarDiferencias(grid_1, grid_2, dgtablas.Rows[i].Cells[0].Value.ToString());
}
}

}



Bueno la parte importante de este ultimo metodo es:
grid_1.DataSource = null;
grid_1.Rows.Clear();
grid_1.DataSource = dataSet.Tables[dgtablas.Rows[i].Cells[0].Value.ToString()];
donde de acuerdo al ciclo vamos llenando el grid consecutivamente con cada tabla que se selecciono de la lista de tablas.

Esa es la solución que yo encontré a ese problema espero y les sirva. si necesitan el código completo de mi aplicación con gusto manden un correo a y les are llegar mi proyecto completo.
Respuesta Responder a este mensaje
#3 jonathan-242
22/05/2012 - 00:58 | Informe spam
Lucas escribió el 07/03/2006 20:35 :
Buenas Tardes

¿Alguien podría decirme cómo hago para llenar varias
tablas en un solo
DataSet?, estas tablas se encuentran en una misma base de datos.

He buscado información sobre el tema y en todos los link's que he
encontrado
dice que si se puede, pero intenté usar un único DataAdapter para
hacerlo,
pero al final, al parecer, por el error que me sale, todas las tablas quedan
con alguno de los campos de la última tabla que llené. Esto lo
digo porque
cuando intento actualizar una de las primeras tablas que agrego al DataSet me
sale un mensaje que dice que tengo que llenar un campo que es obligatorio en
la última tabla, pero ese campo no forma parte de la tabla que intento
actualizar.

¿Es que antes de poder cambiar la sentencia SQL que uso para seleccionar
los
datos que cada tabla debo asignar al DataAdapter un valor nothing o algo asi,
o es que debo usar un DataAdapter por cada Tabla?


public void Llenar_DataSet() //Metodo que creara todas las centencias SQL de acuerdo a las tablas que halla seleccionado.
{
lblstatus.Text = "Procesando informacion ...";
//asignamos el valor del ProgressBar
Pbar.Maximum = dgtablas.RowCount - 1;
//creamos un ciclo para recorrer la tabla y saber que tablas hay que seleccionar
dataSet = new DataSet("BD");

for (int i = 0; i <= dgtablas.RowCount - 1; i++)
{
backgroundWorker1.ReportProgress(i);
if (Convert .ToBoolean (dgtablas.Rows[i].Cells[1].Value) == true)
{
//Lista_Querys += "select * from " + dgtablas.Rows[i].Cells[0].Value.ToString() + ",";

Query = "select * from " + dgtablas.Rows[i].Cells[0].Value.ToString();
SqlDataAdapter adaptador = new SqlDataAdapter();
adaptador .TableMappings .Add ("Table",dgtablas.Rows[i].Cells[0].Value.ToString());
conn = new SqlConnection(sCnn);
conn .Open();
SqlCommand command = new SqlCommand(Query,conn);
command.CommandType = CommandType.Text;
adaptador .SelectCommand =command ;
// Fill the DataSet.
adaptador.Fill(dataSet);
conn.Close();
//ya tenemos las tablas seleccionadas en un DatSet
}

}
lblstatus.Text = "Proceso Terminado";
}
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida