Como iterar através de uma DataTable


143

Eu preciso iterar através de um DataTable. Eu tenho uma coluna lá chamada ImagePath.

Quando estou usando DataReader, faço desta maneira:

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

Como posso conseguir a mesma coisa usando DataTable?


1
dr.Read () lê linha por linha do buffer de rede, não linha por linha do banco de dados. Há apenas uma busca no banco de dados. Portanto, a leitura de uma tabela de dados não oferece nenhum ganho de desempenho.
developer747

Respostas:


286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... assume que a conexão está aberta e o comando está configurado corretamente. Também não verifiquei a sintaxe, mas deve dar uma ideia.


suponha que alguém esteja procurando uma linqsolução e se perguntando onde está (cmd)a solução acima?
Jogi 07/05

@ RehanKhan - cmdseria o comando SQL a ser executado. Se você estiver usando o LINQ, você escreveria sua consulta LINQ e obteria os resultados dessa maneira.
Justin Niessner 7/16

Por que não usar o loop for em vez do foreach? A linha está sendo usada apenas uma vez; portanto, o loop for daria um melhor desempenho?
Enrico

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

Estou escrevendo isso de memória.
Espero que isso lhe dê dicas suficientes para entender o modelo de objeto.

DataTable-> DataRowCollection-> DataRow(qual você pode usar e procurar o conteúdo da coluna para essa linha, usando columnName ou ordinal).

-> = contém.


21

Você também pode usar extensões linq para DataSets:

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

Por favor note que ter AsEnumerable()para DataTableque você precisa para ter System.Data.DataSetExtensionsser adicionado como uma dependência.
sigod

Não disponível no .Net Core, veja aqui: stackoverflow.com/questions/45900952/…
Markive

5

Os exemplos acima são bastante úteis. Mas, se quisermos verificar se uma linha específica está tendo um valor específico ou não. Se sim, exclua e quebre e, caso nenhum valor seja encontrado, jogue o erro diretamente. O código abaixo 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 é uma maneira insana de conseguir excluir linhas !! Apenas emita uma única instrução de exclusão do TSQL!
Mitch Wheat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.