Как пройти через DataTable


149

Мне нужно перебрать DataTable. У меня там есть столбец с именем ImagePath.

Когда я использую, DataReaderя делаю это так:

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

Как я могу добиться того же, используя DataTable?


1
dr.Read () читает построчно из сетевого буфера, а не построчно из базы данных. Есть только одна выборка из базы данных. Следовательно, чтение из таблицы данных не даст никакого прироста производительности.
— developer747

Ответы:


298
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... предполагает, что соединение открыто и команда настроена правильно. Я также не проверял синтаксис, но он должен дать вам представление.


Предположим, кто-то ищет linqрешение и задается вопросом, где находится (cmd)вышеуказанное решение?
— Джоги

@RehanKhan - cmdэто SQL-команда для выполнения. Если вы используете LINQ, вы должны написать свой запрос LINQ и таким образом получить свои результаты.
— Джастин Нисснер

Почему бы не использовать цикл for вместо foreach? row используется только один раз, поэтому цикл for даст лучшую производительность?
— Enrico

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

Пишу это по памяти.
Надеюсь, это даст вам достаточно подсказок, чтобы понять объектную модель.

DataTable-> DataRowCollection-> DataRow(который можно использовать и искать содержимое столбца для этой строки, используя имя столбца или порядковый номер).

-> = содержит.


22

Вы также можете использовать расширения linq для DataSets:

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

1
Обратите внимание, что для того, чтобы иметь AsEnumerable()для DataTableвас, необходимо System.Data.DataSetExtensionsдобавить в качестве зависимости.
— sigod

Недоступно в .Net Core см. Здесь: stackoverflow.com/questions/45900952/…
— Markive

5

Приведенные выше примеры весьма полезны. Но если мы хотим проверить, имеет ли конкретная строка определенное значение или нет. Если да, то удалите и прервите, а в случае, если значение не найдено, выбросить ошибку. Ниже код работает:

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

Это безумный способ удалить строки !! Просто создайте один оператор удаления TSQL!
— Митч Уит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.