0

データベースの各行の値を更新するクエリを作成する for ループを作成したいと考えています。行は、datagridview とデータベースに存在します。目的は、変更が datagridview で行われるときであり、ボタンを使用して変更がデータベーステーブルにも適用されます。各行のバーコードとその数量は異なります。変更がdatagridviewのすべての行で行われた場合、ボタンを使用してデータベースにも適用されるため、パラメータについても助けてください。

for ループで考慮すべきクエリは次のとおりです。

SqlCommand cmd2 = new SqlCommand("update prod_info set item_quantity=@qty where barcode=@barcode ", con);

バーコードを column1、item_quantity を column2 と見なします。

これまで for ループを作成するためにこれを試しましたが、for ループでエラーが発生しました:

for (int i = 0; dataGridView2.Rows.Count; i++)  //getting error here
            {
                SqlCommand cmd2 = new SqlCommand("update prod_info set item_quantity=@qty where barcode=@barcode ", con);
                cmd2.Parameters.AddWithValue("@barcode", dataGridView2.Rows[i].Cells[1].Value.ToString());
                cmd2.Parameters.AddWithValue("@qty", dataGridView2.Rows[i].Cells[1].Value.ToString());
            }
4

1 に答える 1

0

cmd2.ExecuteNonQuery();を呼び出す必要があります。ループ内...そうしないと、SQLコマンドは実行されません

より良い解決策を得るには、ループの前に cmd2 の作成に移動する必要があります。また、そこにパラメーターを追加します (値を割り当てずに) ... ループ内で値を割り当てて ExecuteNonQuery を呼び出すだけです。

おそらく最良の解決策は、データバインディングと、UpdateCommand が割り当てられた SqlDataAdapter を使用することです。

おそらくコードにエラーがあることがわかりました...両方のパラメーターにCell[1]の値を使用しています...

例: 最初に DataTable を作成します ... var dt = new DataTable();

次に、グリッドに必要な列を DataTable に追加します ... dt.Columns.Add("xyz");

次に、DataTable をグリッドにアタッチします: dataGridView2.DataSource = dt;

これで、列「xyz」の内容を編集できるはずです。データベースに値を書き込むには、SqlDataAdapter を作成します ... var adp = new SqlDataAdapter();

次に、adp.InsertCommand = new SqlCommand(...)およびadp.UpdateCommand = new SqlCommand(...)を設定します。

これで、adp.Update();を呼び出すことができます。グリッドからのすべての値が db に書き込まれます。新しく追加された行に対して InsertCommand が呼び出され、編集された行に対して UpdateCommand が呼び出されます。

于 2013-11-03T15:58:27.330 に答える