Durchlaufen einer DataTable


143

Ich muss durch a iterieren DataTable. Ich habe dort eine Spalte mit dem Namen ImagePath.

Wenn ich benutze, DataReadermache ich es so:

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

Wie kann ich mit dem gleichen Ziel erreichen DataTable?


1
dr.Read () liest zeilenweise aus dem Netzwerkpuffer, nicht zeilenweise aus der Datenbank. Es gibt nur einen Abruf aus der Datenbank. Daher bietet das Lesen aus einer Datentabelle keinen Leistungsgewinn.
Entwickler747

Antworten:


286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... setzt voraus, dass die Verbindung offen ist und der Befehl ordnungsgemäß eingerichtet ist. Ich habe auch die Syntax nicht überprüft, aber sie sollte Ihnen die Idee geben.


Angenommen, jemand sucht nach einer linqLösung und fragt sich, wo sich (cmd)die obige Lösung befindet?
Jogi

@RehanKhan - cmdwäre der auszuführende SQL-Befehl. Wenn Sie LINQ verwenden, schreiben Sie Ihre LINQ-Abfrage und erhalten Ihre Ergebnisse auf diese Weise.
Justin Niessner

Warum nicht for loop anstelle von foreach verwenden? Zeile wird nur einmal verwendet, also würde for loop eine bessere Leistung bringen?
Enrico

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

Ich schreibe das aus dem Gedächtnis.
Ich hoffe, dies gibt Ihnen genug Hinweise, um das Objektmodell zu verstehen.

DataTable-> DataRowCollection-> DataRow(welche man verwenden und nach Spalteninhalten für diese Zeile suchen kann, entweder mit columnName oder ordinal).

-> = enthält.


21

Sie können auch linq-Erweiterungen für DataSets verwenden:

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

Bitte beachten Sie, dass AsEnumerable()für DataTableSie System.Data.DataSetExtensionsals Abhängigkeit hinzugefügt werden muss.
Sigod

Nicht verfügbar in .Net Core siehe hier: stackoverflow.com/questions/45900952/…
Markive

5

Die obigen Beispiele sind sehr hilfreich. Aber wenn wir überprüfen wollen, ob eine bestimmte Zeile einen bestimmten Wert hat oder nicht. Wenn ja, dann löschen und unterbrechen und falls kein Wert gefunden wird, wird ein direkter Wurffehler gefunden. Der folgende Code funktioniert:

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

Dies ist ein verrückter Weg, um das Löschen von Zeilen zu erreichen !! Geben Sie einfach eine einzelne TSQL-Löschanweisung aus!
Mitch Wheat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.