Як повторити через таблицю даних


143

Мені потрібно перебрати через DataTable. У мене там стовпчик названий ImagePath.

Коли я використовую, DataReaderя роблю це так:

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

Як я можу досягти того самого, використовуючи DataTable?


1
dr.Read () читає рядки за рядками з мережевого буфера, а не рядки за рядками з бази даних. З бази даних є лише один збір. Отже, читання з даних не збирається принести користь.
developer747

Відповіді:


287
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)у наведеному вище рішенні?
Jogi

@RehanKhan - cmdце команда SQL для виконання. Якщо ви використовуєте LINQ, ви напишете свій запит LINQ і таким чином отримаєте свої результати.
Джастін Нісснер

Чому б не використовувати для циклу замість foreach? рядок використовується лише один раз, щоб цикл дав кращі показники?
Енріко

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

Я пишу це з пам’яті.
Сподіваємось, це дає достатню підказку для розуміння об'єктної моделі.

DataTable-> DataRowCollection-> DataRow(який можна використовувати та шукати вміст стовпця для цього рядка, використовуючи стовпець ім'я або порядковий).

-> = містить.


21

Ви також можете використовувати розширення linq для наборів даних:

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

Зауважте, що матимете AsEnumerable()для DataTableвас, щоб System.Data.DataSetExtensionsвас додали як залежність.
sigod

Чи не доступний в .Net Ядра дивіться тут: 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.