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?

glückliches Lächeln
quelle
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.

Justin Niessner
quelle
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.

shahkalpesh
quelle
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;
}
Lee
quelle
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 ";
            }
        }
Baymax
quelle
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