Cómo iterar a través de una DataTable


143

Necesito iterar a través de a DataTable. Tengo una columna allí llamada ImagePath.

Cuando estoy usando DataReaderlo hago de esta manera:

SqlDataReader dr = null;
dr = cmd.ExecuteReader();
while (dr.Read())
{
    TextBox1.Text = dr["ImagePath"].ToString();
}

¿Cómo puedo lograr lo mismo usando DataTable?


1
dr.Read () lee fila por fila del búfer de red, no fila por fila de la base de datos. Solo hay una búsqueda de la base de datos. Por lo tanto, leer desde una tabla de datos no ofrecerá ninguna ganancia de rendimiento.
developer747

Respuestas:


286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

foreach(DataRow row in dt.Rows)
{
    TextBox1.Text = row["ImagePath"].ToString();
}

... asume que la conexión está abierta y el comando está configurado correctamente. Tampoco revisé la sintaxis, pero debería darte la idea.


supongamos que alguien está buscando una linqsolución y se pregunta dónde está (cmd)la solución anterior.
Jogi

@RehanKhan: cmdsería el comando SQL para ejecutar. Si está utilizando LINQ, escribiría su consulta LINQ y obtendría sus resultados de esa manera.
Justin Niessner

¿Por qué no usar for loop en lugar de foreach? fila solo se usa una vez, entonces, ¿para loop daría un mejor rendimiento?
Enrico

32
foreach (DataRow row in myDataTable.Rows)
{
   Console.WriteLine(row["ImagePath"]);
}

Estoy escribiendo esto de memoria.
Espero que esto te dé pistas suficientes para entender el modelo de objetos.

DataTable-> DataRowCollection-> DataRow(cuál puede usar y buscar el contenido de la columna para esa fila, ya sea usando columnName u ordinal).

-> = contiene.


21

También puede usar extensiones linq para DataSets:

var imagePaths = dt.AsEnumerble().Select(r => r.Field<string>("ImagePath");
foreach(string imgPath in imagePaths)
{
    TextBox1.Text = imgPath;
}

Tenga en cuenta que para tener AsEnumerable()para DataTableusted debe System.Data.DataSetExtensionsagregarse como una dependencia.
sigod

No disponible en .Net Core ver aquí: stackoverflow.com/questions/45900952/…
Markive

5

Los ejemplos anteriores son bastante útiles. Pero, si queremos verificar si una fila particular tiene un valor particular o no. En caso afirmativo, elimine y rompa y, en caso de que no haya valor, se encuentra un error de tiro directo. El siguiente código funciona:

foreach (DataRow row in dtData.Rows)
        {
            if (row["Column_name"].ToString() == txtBox.Text)
            {
                // Getting the sequence number from the textbox.
                string strName1 = txtRowDeletion.Text;

                // Creating the SqlCommand object to access the stored procedure
                // used to get the data for the grid.
                string strDeleteData = "Sp_name";
                SqlCommand cmdDeleteData = new SqlCommand(strDeleteData, conn);
                cmdDeleteData.CommandType = System.Data.CommandType.StoredProcedure;

                // Running the query.
                conn.Open();
                cmdDeleteData.ExecuteNonQuery();
                conn.Close();

                GetData();

                dtData = (DataTable)Session["GetData"];
                BindGrid(dtData);

                lblMsgForDeletion.Text = "The row successfully deleted !!" + txtRowDeletion.Text;
                txtRowDeletion.Text = "";
                break;
            }
            else
            {
                lblMsgForDeletion.Text = "The row is not present ";
            }
        }

¡Esta es una forma increíble de eliminar filas! ¡Solo emita una sola declaración de eliminación de TSQL!
Mitch Wheat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.