Discussion:
Como moverme por un Datatable
(demasiado antiguo para responder)
Ambros
2004-02-12 16:16:05 UTC
Permalink
Hola a todos

Tengo un problemilla que creo me podréis solucionar.

Ataco a una tabla de SQL Server en un programa C# usando un dataset,
dataadapter y una datatable de la sgte forma:


string auxSQL = "SELECT * from TB_PREVISION WHERE PRODUCT_ID= " +
dblProductoOriginal.ToString ();

System.Data.DataSet auxDataSet = new System.Data.DataSet ();

System.Data.SqlClient.SqlDataAdapter auxDataAdapter = new
System.Data.SqlClient.SqlDataAdapter (new System.Data.SqlClient.SqlCommand
(auxSQL, this.ConexionSQL ));

System.Data.SqlClient.SqlCommandBuilder auxCommand = new
System.Data.SqlClient.SqlCommandBuilder (auxDataAdapter);

auxDataAdapter.FillSchema (auxDataSet,System.Data.SchemaType.Source );

System.Data.DataTable auxDataTable = new System.Data.DataTable ();

auxDataTable = auxDataSet.Tables ["Table"];

auxDataTable.TableName = "TB_PREVISION";



Mi pregunta es: ¿Como me puedo mover por los registros de este datatable? Me
refiero a algo parecido a MoveNext del ADO 2.x

Esto de moverme por los registros lo he hecho con un Datareader pero no es
actualizable, y querría, ya que estoy en una fila determinada, poder
actualizar un campo

¿Me podeis ayudar?
A.Poblacion
2004-02-12 19:56:05 UTC
Permalink
Post by Ambros
Mi pregunta es: ¿Como me puedo mover por los registros de este datatable? Me
refiero a algo parecido a MoveNext del ADO 2.x
El datatable es como un array en memoria. Por ejemplo:

for (int i=0; i<auxDataTable.Rows.Count; i++)
{
DataRow dr = auxDataTable.Rows[i];
string primeraColumna = (string)dr[0]:
int segundaColumna = (int)dr[1];
}
Rodrigo Corral González [MVP]
2004-02-12 21:26:03 UTC
Permalink
A mí personalmente, me gusta mas el for each:

for each (DataRow dr in auxDataTable.Rows)
{
string primeraColumna = (string)dr[0]:
int segundaColumna = (int)dr[1];
}
--
Un saludo
Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Ambros
2004-02-13 07:41:52 UTC
Permalink
Ayer noche le estuve dando vueltas y al final utilicé el foreach por la
colleccion de Datarows.

Muchas gracias por vuestra ayuda, así tb. puedo comprobar que he elegido una
buena solución.
Post by Rodrigo Corral González [MVP]
for each (DataRow dr in auxDataTable.Rows)
{
int segundaColumna = (int)dr[1];
}
--
Un saludo
Rodrigo Corral González [MVP]
microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Tristan
2004-02-13 22:11:33 UTC
Permalink
Pero no olvides que DataReader es en muchos casos recomendable. Ten en
cuenta que como te han dicho, DataSet/DataTable es una especie de array, es
decir una estructura en memoria. No siempre ha de ser interesante bajar a
memoria una tabla, y sobre todo nunca si es grande.

Te lo digo para que no cometas el error de confundir un DataTable con un
recordset de ADO, por que son muy distintos. DataTable, vendría a ser
equivalente a un cursor ADO de cliente. En cambio DataReader vendría a ser
igual a un cursor de servidor de solo lectura y solo avance.

En realidad, los DataTable se llenan con el Fill del DataAdapter que
internamente llama a un DataReader. Para volcar los cambios a la base de
datos, se utiliza el método Update del DataAdapter, que llama al comando de
inserción, actualización, o borrado según corresponda por cada fila.
Realmente se puede hacer lo mismo mediante DataReader y comandos.

--
Juan Carlos Badiola
MVP - C#

A.Poblacion
2004-02-13 15:02:49 UTC
Permalink
A mi también me gusta más el foreach, pero la pregunta original
mencionaba los métodos Move del Recordset de ADO, y el foreach sólo es capaz
de emular el MoveNext, pero no el resto de los movimientos, mientras que
accediendo al indexador de Rows sí que puedes avanzar y retroceder sobre el
DataSet.
mente
2004-02-13 08:19:51 UTC
Permalink
A parte del foreach para recorrer todos los rows te puede interesar tambien
crear una clave principal para la tabla lo que te permitira buscar
directamente el registro deseado.

Para crear la clave:

System.Data.DataColumn c1 =
dataTable.Columns["Nombre_Campo]";
dataTable.PrimaryKey=new System.Data.DataColumn[]{c1};

Para buscar registros:

DataRow dr=dataTable.Rows.Find("Clave_Deseada");

lo que te devolverá la fila que contiene los valores de clave principal
especificados.

Espero que te ayude.
Post by Ambros
Hola a todos
Tengo un problemilla que creo me podréis solucionar.
Ataco a una tabla de SQL Server en un programa C# usando un dataset,
string auxSQL = "SELECT * from TB_PREVISION WHERE PRODUCT_ID= " +
dblProductoOriginal.ToString ();
System.Data.DataSet auxDataSet = new System.Data.DataSet ();
System.Data.SqlClient.SqlDataAdapter auxDataAdapter = new
System.Data.SqlClient.SqlDataAdapter (new System.Data.SqlClient.SqlCommand
(auxSQL, this.ConexionSQL ));
System.Data.SqlClient.SqlCommandBuilder auxCommand = new
System.Data.SqlClient.SqlCommandBuilder (auxDataAdapter);
auxDataAdapter.FillSchema (auxDataSet,System.Data.SchemaType.Source );
System.Data.DataTable auxDataTable = new System.Data.DataTable ();
auxDataTable = auxDataSet.Tables ["Table"];
auxDataTable.TableName = "TB_PREVISION";
Mi pregunta es: ¿Como me puedo mover por los registros de este datatable? Me
refiero a algo parecido a MoveNext del ADO 2.x
Esto de moverme por los registros lo he hecho con un Datareader pero no es
actualizable, y querría, ya que estoy en una fila determinada, poder
actualizar un campo
¿Me podeis ayudar?
Loading...