DataTableを反復処理する方法


143

を反復処理する必要がありDataTableます。そこにという列がありImagePathます。

私が使用しているDataReaderときは、次のようにします。

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

どのようにして同じことを達成できDataTableますか?


1
dr.Read()は、データベースから行ごとではなく、ネットワークバッファーから行ごとに読み取ります。データベースからのフェッチは1つだけです。したがって、データテーブルからの読み取りでは、パフォーマンスは向上しません。
developer747

回答:


286
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、2016年

@RehanKhan- cmd実行するSQLコマンドになります。LINQを使用している場合は、LINQクエリを記述して、その方法で結果を取得します。
Justin Niessner、2016年

foreachの代わりにforループを使用しないのはなぜですか?行は一度しか使用されないので、forループの方がパフォーマンスが向上しますか?
Enrico

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

私はこれを記憶から書いています。
これにより、オブジェクトモデルを理解するための十分なヒントが得られることを願っています。

DataTable-> DataRowCollection-> DataRow(columnNameまたはordinalを使用して、その行の列コンテンツを使用および検索できます)。

-> =含む。


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

ネットコアでは使用できませんこちらをご覧ください: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削除ステートメントを発行するだけです!
Mitch Wheat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.