Come scorrere una DataTable


143

Ho bisogno di scorrere attraverso a DataTable. Ho una colonna lì chiamata ImagePath.

Quando sto usando DataReaderlo faccio in questo modo:

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

Come posso ottenere la stessa cosa usando DataTable?


1
dr.Read () legge riga per riga dal buffer di rete, non riga per riga dal database. C'è solo un recupero dal database. Quindi la lettura da un datatable non offrirà alcun miglioramento delle prestazioni.
developer747,

Risposte:


287
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... presuppone che la connessione sia aperta e il comando sia impostato correttamente. Inoltre non ho verificato la sintassi, ma dovrebbe darti l'idea.


supponiamo che qualcuno stia cercando una linqsoluzione e si stia chiedendo dov'è (cmd)la soluzione sopra?
Jogi

@RehanKhan - cmdsarebbe il comando SQL da eseguire. Se stai usando LINQ, dovresti scrivere la tua query LINQ e ottenere i risultati in questo modo.
Justin Niessner,

Perché non usare per loop anziché foreach? la riga viene utilizzata solo una volta, quindi per il loop si ottengono prestazioni migliori?
Enrico,

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

Sto scrivendo questo dalla memoria.
Spero che questo ti dia abbastanza suggerimenti per capire il modello a oggetti.

DataTable-> DataRowCollection-> DataRow(che è possibile utilizzare e cercare il contenuto della colonna per quella riga, usando columnName o ordinale).

-> = contiene.


21

Puoi anche usare le estensioni linq per DataSet:

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

Si prega di notare che per avere AsEnumerable()per DataTableè necessario avere System.Data.DataSetExtensionsessere aggiunto come una dipendenza.
sigod,

Non disponibile in Net Nucleo vedere qui: stackoverflow.com/questions/45900952/...
Markive

5

Gli esempi sopra sono abbastanza utili. Ma, se vogliamo verificare se una determinata riga ha un valore particolare o meno. Se sì, eliminare e rompere e in caso di nessun valore trovato errore di lancio diretto. Di seguito il codice funziona:

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

Questo è un modo folle per ottenere l'eliminazione delle righe !! Emetti una singola dichiarazione di eliminazione TSQL!
Mitch Wheat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.