Jak wykonać iterację w DataTable


143

Muszę powtórzyć plik DataTable. Mam tam kolumnę o nazwie ImagePath.

Kiedy używam DataReader, robię to w ten sposób:

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

Jak mogę osiągnąć to samo używając DataTable?


1
dr.Read () odczytuje wiersz po wierszu z bufora sieciowego, a nie wiersz po wierszu z bazy danych. Jest tylko jedno pobieranie z bazy danych. Dlatego czytanie z datatable nie zapewni żadnego wzrostu wydajności.
programista747

Odpowiedzi:


286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... zakłada, że ​​połączenie jest otwarte, a polecenie skonfigurowane poprawnie. Nie sprawdziłem też składni, ale to powinno dać ci pomysł.


załóżmy, że ktoś szuka linqrozwiązania i zastanawia się, gdzie jest (cmd)w powyższym rozwiązaniu?
Jogi

@RehanKhan - cmdbyłoby poleceniem SQL do wykonania. Jeśli używasz LINQ, napisz zapytanie LINQ i uzyskasz w ten sposób wyniki.
Justin Niessner

Dlaczego nie użyć pętli for zamiast foreach? wiersz jest używany tylko raz, więc pętla for zapewni lepszą wydajność?
Enrico,

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

Piszę to z pamięci.
Mam nadzieję, że daje to wystarczającą wskazówkę, aby zrozumieć model obiektowy.

DataTable-> DataRowCollection-> DataRow(którego można użyć & szukać zawartości kolumny dla tego wiersza, używając columnName lub ordinal).

-> = zawiera.


21

Możesz także użyć rozszerzeń linq dla DataSets:

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

Należy pamiętać, że aby mieć AsEnumerable()do DataTableżebyś nie System.Data.DataSetExtensionsbyć dodawany jako zależność.
sigod

Niedostępne w .Net Core, patrz tutaj: stackoverflow.com/questions/45900952/ ...
Markive

5

Powyższe przykłady są bardzo pomocne. Ale jeśli chcemy sprawdzić, czy określony wiersz ma określoną wartość, czy nie. Jeśli tak, usuń i przełam, aw przypadku braku wartości znaleziony błąd rzutu prostego. Poniższy kod działa:

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

To szalony sposób usuwania wierszy !! Po prostu wyemituj jedną instrukcję usuwania TSQL!
Mitch Wheat,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.