現在C#で住所録を作成しており、削除フラグを使用して論理削除するという課題に悩んでいます。
テーブルカラムにはDEL_FLG作成済みです。
削除ボタン(DelBtn)をクリックすると確認メッセージ表示後にDataGridViewのその行を削除するという仕様です。
削除ボタンクリックイベント内削除処理の"UPDATE mst_address SET DEL_FLG = 1"のWHERE句の指定の仕方がわからず、現在は削除ボタンをクリックすると全てのデータのDEL_FLGが1になってしまいます。WHERE句で削除ボタンをクリックした行を指定するにはどうしたら良いでしょうか?
テーブルは以下になります。
主キーはSEQ_NOとなっており、非表示の状態です。
一行ごとに削除ボタンがあるDataGridViewで、ボタンを押下した行を削除するという仕様です。
よろしくお願い致します。
SQL
1 2CREATE TABLE `mst_address` ( 3 `SEQ_NO` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理番号', 4 `NAME1` varchar(10) NOT NULL COMMENT '氏名1', 5 `NAME2` varchar(10) NOT NULL COMMENT '氏名2', 6 `ZIP1` varchar(3) NOT NULL COMMENT '郵便番号1', 7 `ZIP2` varchar(4) NOT NULL COMMENT '郵便番号2', 8 `ADDRESS3` varchar(100) NOT NULL COMMENT '住所3', 9 `ADDRESS1` varchar(100) DEFAULT NULL COMMENT '住所1', 10 `ADDRESS2` varchar(100) DEFAULT NULL COMMENT '住所2', 11 `TEL` varchar(20) DEFAULT NULL COMMENT '電話番号', 12 `INS_USER` varchar(10) NOT NULL COMMENT '登録者', 13 `INS_DATETIME` datetime NOT NULL COMMENT '登録日', 14 `UPD_USER` varchar(10) NOT NULL COMMENT '更新者', 15 `UPD_DATETIME` datetime NOT NULL COMMENT '更新日', 16 `DEL_FLG` bit(1) NOT NULL COMMENT '削除フラグ', 17 PRIMARY KEY (`SEQ_NO`) 18) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 19
追記
主キーSEQ_NOを追加(テーブルには非表示)し、WHERE句に指定した修正後ソースコードです。
dataGridView1.CurrentRow.Cells[1].ValueでSEQ_NOの値が取得できることは確認しています。
C#
1namespace AddressList 2{ 3 public partial class AddressList : Form 4 { 5 public AddressList() 6 { 7 InitializeComponent(); 8 } 9 10 public void 住所一覧_Load(object sender, EventArgs e) 11 { 12 // MySQLへの接続 13 using (MySqlCommand command = new MySqlCommand()) 14 { 15 MySqlConnection conn = new MySqlConnection(); 16 conn.ConnectionString = "server=サーバ名; user id=ID; Password=PW; database=address_note"; 17 18 //DBとの接続オープン 19 conn.Open(); 20 21 //データを保存するテーブル作成 22 DataTable dt = new DataTable(); 23 24 //SQL文と接続情報を引数に、データアダプターを作成 25 MySqlDataAdapter da = new MySqlDataAdapter("SELECT **SEQ_NO,** NAME1,NAME2,ZIP1,ZIP2,ADDRESS1,ADDRESS2,ADDRESS3,TEL FROM mst_address WHERE DEL_FLG = 0", conn); 26 27 28 //SQL文で指定したデータをDataTableに格納 29 da.Fill(dt); 30 31 //表示させる 32 dataGridView1.DataSource = dt; 33 34 //DBとの接続クローズ 35 conn.Close(); 36 37 38 ** dataGridView1.Columns[1].Visible = false; //SEQ_NOを非表示にする** 39 //横幅指定・削除ボタン配置 40 dataGridView1.Columns[2].Width = 50; 41 dataGridView1.Columns[3].Width = 45; 42 dataGridView1.Columns[4].Width = 40; 43 dataGridView1.Columns[5].Width = 40; 44 dataGridView1.Columns[6].Width = 70; 45 dataGridView1.Columns[7].Width = 42; 46 dataGridView1.Columns[8].Width = 40; 47 dataGridView1.Columns[9].Width = 90; 48 dataGridView1.Columns["DelBtn"].DisplayIndex = 9; 49 50 //氏名昇順でソートする 51 dataGridView1.Sort(dataGridView1.Columns[2], ListSortDirection.Ascending); 52 } 53 } 54 55 //検索ボタン 56 private void Button1_Click_1(object sender, EventArgs e) 57 { 58 { 59 //テキストボックスの文字取得 60 string prefecture = AddressSrc.Text; 61 string name = NameSrc.Text; 62 63 //未入力で検索押下時 64 if (prefecture == "" && name == "") 65 { 66 MessageBox.Show("氏名または都道府県を入力してください"); 67 } 68 else if (prefecture != "") //都道府県検索 69 { 70 //MySQLへ接続 71 MySqlConnection conn = new MySqlConnection(); 72 conn.ConnectionString = Properties.Settings.Default.address_noteConnectionString; 73 MySqlCommand sqlCommand = new MySqlCommand(@"SELECT **SEQ_NO**, NAME1, NAME2, ZIP1, ZIP2, ADDRESS1, ADDRESS2, ADDRESS3, TEL FROM mst_address WHERE ADDRESS1 = @ADDRESS1 AND DEL_FLG = 0", conn); 74 75 //データを保存するテーブル作成 76 DataTable dt = new DataTable(); 77 78 try 79 { 80 //DBとの接続オープン 81 conn.Open(); 82 83 sqlCommand.Parameters.Add(new MySqlParameter(@"ADDRESS1", prefecture)); 84 85 MySqlDataReader reader = sqlCommand.ExecuteReader(); 86 87 dt.Load(reader); 88 89 dataGridView1.DataSource = dt; 90 91 reader.Close(); 92 } 93 catch 94 { 95 MessageBox.Show("検索エラーです"); 96 } 97 finally 98 { 99 conn.Close(); 100 } 101 } 102 else if (name != "") //氏名検索 103 { 104 //MySQLへ接続 105 MySqlConnection conn = new MySqlConnection(); 106 conn.ConnectionString = Properties.Settings.Default.address_noteConnectionString; 107 MySqlCommand sqlCommand = new MySqlCommand(@"SELECT **SEQ_NO**, NAME1, NAME2, ZIP1, ZIP2, ADDRESS1, ADDRESS2, ADDRESS3, TEL FROM mst_address WHERE NAME1 LIKE @NAME1 AND DEL_FLG = 0", conn); 108 109 //データを保存するテーブル作成 110 DataTable dt = new DataTable(); 111 112 try 113 { 114 //DBとの接続オープン 115 conn.Open(); 116 117 sqlCommand.Parameters.Add(new MySqlParameter(@"NAME1", @"%" + name + @"%")); 118 119 MySqlDataReader reader = sqlCommand.ExecuteReader(); 120 121 dt.Load(reader); 122 123 dataGridView1.DataSource = dt; 124 125 reader.Close(); 126 } 127 catch 128 { 129 MessageBox.Show("検索エラーです"); 130 } 131 finally 132 { 133 conn.Close(); 134 } 135 } 136 } 137 } 138 139 140 // 終了ボタン 141 private void Button2_Click(object sender, EventArgs e) 142 { 143 this.Close(); 144 } 145 146 //削除ボタン 147 private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 148 { 149 // 削除ボタンの列かどうかを確認 150 if (e.ColumnIndex == this.dataGridView1.Columns["DelBtn"].Index) 151 { 152 if (DialogResult.Yes == MessageBox.Show("削除してもよろしいですか?", "削除", 153 MessageBoxButtons.YesNo, MessageBoxIcon.Question)) 154 { 155 // 削除 156 //this.dataGridView1.Rows.RemoveAt(e.RowIndex); 157 158 MySqlConnection conn = new MySqlConnection(); 159 conn.ConnectionString = Properties.Settings.Default.address_noteConnectionString; 160 conn.Open(); 161 MySqlCommand sqlCommand = new MySqlCommand("UPDATE mst_address SET DEL_FLG = 1** WHERE SEQ_NO = dataGridView1.CurrentRow.Cells[1].Value**", conn); 162 DataTable dt = new DataTable(); 163 MySqlDataReader reader = sqlCommand.ExecuteReader(); 164 dt.Load(reader); 165 dataGridView1.DataSource = dt; 166 reader.Close(); 167 168 MessageBox.Show("削除完了しました。"); 169 170 } 171 else 172 { 173 this.Close(); 174 } 175 } 176 } 177 } 178} 179 180
回答3件
あなたの回答
tips
プレビュー