Как пройти через 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 ";
            }
        }
Baymax
источник
Это безумный способ удалить строки !! Просто создайте один оператор удаления TSQL!
Митч Уит