実現したいこと
C#でDataGridViewに連番、商品名、型番、重量、値段、個数というのがあって表ができています。そして削除、追加、更新、移動、ソートのできるボタンがあり、datagridviewをいじることができます。その後、データベース登録ボタンを押すと、データベースに反映できるようにしたい。そのとき、データベース側ではRegDate(新規に登録されたもののみ)とUpdDate(情報が書き換わったとき)を更新したいです。
前提
C#とマイクロソフトのSQLserverをつかっています。
該当のソースコード
僕が組んでみたプログラムなのですが、これだと、一番最後の行が真ん中に来たり、RegDate,UpdDateが更新されなかったりします。
Productクラスを作ってインスタンスをobjectに格納しています。
SQL側は触りたくないです。C#のみで完結させてしまいたいです。
private bool ClickDbOutPut() { bool success = false; try { using (SqlConnection conn = new SqlConnection(_conectionString)) { conn.Open(); SqlTransaction tran = conn.BeginTransaction(); try { List<int> dbSeqNos = new List<int>(); using (SqlCommand cmd = new SqlCommand("SELECT SeqNo FROM ProductTable", conn, tran)) using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { dbSeqNos.Add((int)reader["SeqNo"]); } } if (dgvList.SelectedRows.Count > 0) { var selectedRow = dgvList.SelectedRows[0]; //最初に選択されている行を取得。 var selectedProduct = selectedRow.Cells[(int)ColProductIdx.Object].Value as Product; if (selectedProduct != null) { int deleteSeqNo = selectedProduct.OriginalNo ?? selectedProduct.No; // 削除 SqlCommand deleteCmd = new SqlCommand("delete from ProductTable where SeqNo = @SeqNo", conn, tran); deleteCmd.Parameters.AddWithValue("@SeqNo", deleteSeqNo); deleteCmd.ExecuteNonQuery(); SqlCommand shiftCmd = new SqlCommand("update ProductTable set SeqNo = SeqNo - 1 where SeqNo > @SeqNo", conn, tran); shiftCmd.Parameters.AddWithValue("@SeqNo", deleteSeqNo); shiftCmd.ExecuteNonQuery(); } } foreach (DataGridViewRow row in dgvList.Rows) { var product = row.Cells[(int)ColProductIdx.Object].Value as Product; if (product == null) continue; int checkSeqNo = product.OriginalNo ?? product.No; // DBから該当レコードを取得 SqlCommand selectCmd = new SqlCommand("SELECT * FROM ProductTable WHERE SeqNo = @SeqNo", conn, tran); selectCmd.Parameters.AddWithValue("@SeqNo", checkSeqNo); Product dbProduct = null; using (SqlDataReader reader = selectCmd.ExecuteReader()) { if (reader.Read()) { dbProduct = new Product { No = (int)reader["SeqNo"], Name = reader["ProductName"] as string, ModelNumber = reader["ModelNumber"] as string, Weight = reader["ProductWeight"] as decimal?, Price = reader["ProductPrice"] as int?, Quantity = reader["ProductQuantity"] as int? }; } } int targetSeqNo = product.OriginalNo ?? product.No; if (dbProduct != null && ((dbProduct.Name ?? "") != (product.Name ?? "") || (dbProduct.ModelNumber ?? "") != (product.ModelNumber ?? "") || (dbProduct.Weight ?? 0) != (product.Weight ?? 0) || (dbProduct.Price ?? 0) != (product.Price ?? 0) || (dbProduct.Quantity ?? 0) != (product.Quantity ?? 0) || dbProduct.No != product.No)) { SqlCommand updateCmd = new SqlCommand(@" UPDATE ProductTable SET ProductName = @ProductName, ModelNumber = @ModelNumber, ProductWeight = @ProductWeight, ProductPrice = @ProductPrice, ProductQuantity = @ProductQuantity, UpdDate = GETDATE() WHERE SeqNo = @SeqNo", conn, tran); updateCmd.Parameters.AddWithValue("@SeqNo", targetSeqNo); updateCmd.Parameters.AddWithValue("@ProductName", product.Name ?? ""); updateCmd.Parameters.AddWithValue("@ModelNumber", product.ModelNumber ?? ""); updateCmd.Parameters.AddWithValue("@ProductWeight", (object)product.Weight ?? DBNull.Value); updateCmd.Parameters.AddWithValue("@ProductPrice", (object)product.Price ?? DBNull.Value); updateCmd.Parameters.AddWithValue("@ProductQuantity", (object)product.Quantity ?? DBNull.Value); updateCmd.ExecuteNonQuery(); } } foreach (DataGridViewRow row in dgvList.Rows)。 { var product = row.Cells[(int)ColProductIdx.Object].Value as Product; if (product == null) continue; int checkSeqNo; if (product.OriginalNo.HasValue) { checkSeqNo = product.OriginalNo.Value; } else { checkSeqNo = -1; } SqlCommand checkCmd = new SqlCommand("select count(*) from ProductTable where SeqNo = @SeqNo", conn, tran); //コマンド作成 checkCmd.Parameters.AddWithValue("@SeqNo", checkSeqNo); int exists = (int)checkCmd.ExecuteScalar(); if (exists == 0) { SqlCommand maxSeqNoCmd = new SqlCommand("SELECT ISNULL(MAX(SeqNo), 0) FROM ProductTable", conn, tran); int maxSeqNo = (int)maxSeqNoCmd.ExecuteScalar(); if (product.No > maxSeqNo + 1) { continue; } //SqlCommand shiftCmd = new SqlCommand("UPDATE ProductTable SET SeqNo = SeqNo + 1 WHERE SeqNo >= @SeqNo", conn, tran); //shiftCmd.Parameters.AddWithValue("@SeqNo", product.No); //shiftCmd.ExecuteNonQuery(); SqlCommand insertCmd = new SqlCommand(@"INSERT INTO ProductTable (SeqNo, ProductName, ModelNumber, ProductWeight, ProductPrice, ProductQuantity, RegDate, UpdDate) VALUES (@SeqNo, @ProductName, @ModelNumber, @ProductWeight, @ProductPrice, @ProductQuantity, GETDATE(), GETDATE())", conn, tran); insertCmd.Parameters.AddWithValue("@SeqNo", product.No); insertCmd.Parameters.AddWithValue("@ProductName", product.Name ?? ""); insertCmd.Parameters.AddWithValue("@ModelNumber", product.ModelNumber ?? ""); insertCmd.Parameters.AddWithValue("@ProductWeight", (object)product.Weight ?? DBNull.Value); insertCmd.Parameters.AddWithValue("@ProductPrice", (object)product.Price ?? DBNull.Value); insertCmd.Parameters.AddWithValue("@ProductQuantity", (object)product.Quantity ?? DBNull.Value); insertCmd.ExecuteNonQuery();}}
tran.Commit();
success = true;
foreach (DataGridViewRow row in dgvList.Rows){
var product = row.Cells[(int)ColProductIdx.Object].Value as Product;
if (product != null)
{product.OriginalNo = product.No;}}}
catch (Exception ex) {
tran.Rollback();
MessageBox.Show("DB更新エラー: " + ex.Message); } } }
catch (Exception ex){ }
return success; }

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/06/16 05:01
2025/06/17 00:30 編集