Cara mengulang melalui DataTable

143

Saya perlu beralih melalui a DataTable. Saya memiliki kolom di sana bernama ImagePath.

Ketika saya menggunakan DataReadersaya melakukannya dengan cara ini:

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

Bagaimana saya bisa menggunakan hal yang sama DataTable?

Senyum bahagia
sumber
1
dr.Read () membaca baris demi baris dari buffer jaringan, bukan baris demi baris dari basis data. Hanya ada satu pengambilan dari basis data. Oleh karena itu membaca dari data tidak akan menawarkan keuntungan kinerja apa pun.
developer747

Jawaban:

286
DataTable dt = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);

adapter.Fill(dt);

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

... menganggap koneksi terbuka dan perintah sudah diatur dengan benar. Saya juga tidak memeriksa sintaksnya, tetapi itu seharusnya memberi Anda ide.

Justin Niessner
sumber
misalkan seseorang mencari linqsolusi dan bertanya-tanya di mana (cmd)di dalam solusi di atas?
Jogi
@RehanKhan - cmdakan menjadi Perintah SQL untuk dijalankan. Jika Anda menggunakan LINQ, Anda akan menulis Permintaan LINQ Anda dan mendapatkan hasilnya seperti itu.
Justin Niessner
Mengapa tidak menggunakan untuk loop bukan foreach? baris hanya digunakan sekali, jadi untuk loop akan memberikan kinerja yang lebih baik?
Enrico
32
foreach (DataRow row in myDataTable.Rows)
{
   Console.WriteLine(row["ImagePath"]);
}

Saya menulis ini dari memori.
Semoga ini memberi Anda cukup petunjuk untuk memahami model objek.

DataTable-> DataRowCollection-> DataRow(yang mana dapat digunakan & mencari konten kolom untuk baris itu, baik menggunakan nama kolom atau ordinal).

-> = berisi.

shahkalpesh
sumber
21

Anda juga dapat menggunakan ekstensi LINQ untuk DataSets:

var imagePaths = dt.AsEnumerble().Select(r => r.Field<string>("ImagePath");
foreach(string imgPath in imagePaths)
{
    TextBox1.Text = imgPath;
}
Lee
sumber
Harap dicatat bahwa memiliki AsEnumerable()untuk DataTableAnda harus System.Data.DataSetExtensionsditambahkan sebagai ketergantungan.
sigod
Tidak tersedia di .Net Core, lihat di sini: stackoverflow.com/questions/45900952/…
Markive
5

Contoh di atas cukup membantu. Tetapi, apakah kita ingin memeriksa apakah baris tertentu memiliki nilai tertentu atau tidak. Jika ya maka hapus dan patahkan dan jika tidak ada nilai ditemukan kesalahan melempar langsung. Kode di bawah ini berfungsi:

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
sumber
Ini adalah cara gila untuk menyelesaikan penghapusan baris !! Hanya memancarkan pernyataan penghapusan TSQL tunggal!
Mitch Wheat