Comment parcourir un DataTable

143

Je dois parcourir un fichier DataTable. J'ai là une colonne nommée ImagePath.

Lorsque j'utilise, DataReaderje le fais de cette façon:

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

Comment puis-je réaliser la même chose en utilisant DataTable?

sourire heureux
la source
1
dr.Read () lit ligne par ligne à partir du tampon réseau, et non ligne par ligne à partir de la base de données. Il n'y a qu'une seule extraction de la base de données. Par conséquent, la lecture à partir d'une table de données n'offrira aucun gain de performance.
developer747

Réponses:

287
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... suppose que la connexion est ouverte et que la commande est correctement configurée. Je n'ai pas non plus vérifié la syntaxe, mais cela devrait vous donner une idée.

Justin Niessner
la source
supposons que quelqu'un cherche une linqsolution et se demande où se trouve (cmd)la solution ci-dessus?
Jogi
@RehanKhan - cmdserait la commande SQL à exécuter. Si vous utilisez LINQ, vous écrivez votre requête LINQ et obtenez vos résultats de cette façon.
Justin Niessner
Pourquoi ne pas utiliser for loop au lieu de foreach? row n'est utilisé qu'une seule fois, donc la boucle for donnerait de meilleures performances?
Enrico
32
foreach (DataRow row in myDataTable.Rows)
{
   Console.WriteLine(row["ImagePath"]);
}

J'écris ceci de mémoire.
J'espère que cela vous donne suffisamment d'indices pour comprendre le modèle d'objet.

DataTable-> DataRowCollection-> DataRow(que l'on peut utiliser et rechercher le contenu de la colonne pour cette ligne, soit en utilisant columnName ou ordinal).

-> = contient.

shahkalpesh
la source
21

Vous pouvez également utiliser les extensions linq pour les DataSets:

var imagePaths = dt.AsEnumerble().Select(r => r.Field<string>("ImagePath");
foreach(string imgPath in imagePaths)
{
    TextBox1.Text = imgPath;
}
Lee
la source
Veuillez noter que pour avoir AsEnumerable()pour DataTablevous devez avoir System.Data.DataSetExtensionsété ajouté en tant que dépendance.
sigod
Non disponible dans .Net Core voir ici: stackoverflow.com/questions/45900952/…
Markive
5

Les exemples ci-dessus sont très utiles. Mais, si nous voulons vérifier si une ligne particulière a une valeur particulière ou non. Si oui, supprimez et coupez et en cas de non valeur trouvée, erreur de lancer direct. Le code ci-dessous fonctionne:

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 ";
            }
        }
baymax
la source
C'est une façon insensée d'accomplir la suppression de lignes !! Émettez simplement une seule instruction de suppression TSQL!
Mitch Wheat