質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1079閲覧

BDのレコードの削除方法

maam

総合スコア55

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/01/15 02:58

VisualStudioのWindowsFormを使用しています。
Form1で全生徒の登録情報一覧をDataGridViewで表示しています。
それぞれの生徒情報の右端には「編集ボタン」があり、押すと編集画面Form2へ遷移します。

Form1

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = (DataGridView)sender; //編集ボタンを押したときの処理 if (dgv.Columns[e.ColumnIndex].Name == "編集") { this.Hide(); //編集ボタンを押した行データを渡す Form2 form2 = new Form2(dgv.Rows[e.RowIndex]); form2.Show(); } }

Form2

//削除ボタン押下時 private void DeleteBt_Click(object sender, EventArgs e) { // 接続文字列の取得 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; // データベース接続の準備 using (var connection = new SqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの準備 command.CommandText = @"DELETE MEMBER_MASTER WHERE" ; // SQLの実行 command.ExecuteNonQuery(); } finally { // データベースの接続終了 connection.Close(); }

編集ボタンを押した生徒情報のレコードを削除するには
@"DELETE MEMBER_MASTER WHERE"の部分をどう書けばよいですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/01/15 03:07

過去の質問を丁寧に見ればわかるのかもしれませんが、生徒って何をもって特定できますか?(DB的に言えば主キーは何ですか?)ちらっと拝見したところでは、ユニークキーがなさそうな気がするのですが。
maam

2019/01/15 03:51

主キーは生徒IDです。シーケンスで発番するように設定しています。
guest

回答1

0

ベストアンサー

DBの構造と編集画面の内容がわからないと完全には回答できませんが・・・。
IDが主キーと仮定して・・・。

csharp

1// SQLの準備 2command.CommandText = @"DELETE MEMBER_MASTER WHERE ID = @ID"; 3command.Parameters.Add(new SqlParameter("@ID", id)); 4 5// SQLの実行 6command.ExecuteNonQuery();

上記のように、SQL文の中に@パラメタ名でパラメタを定義し、
command.Parameters.Add(new SqlParameter("@ID", id));
のようにそのパラメタに対応する値をセットします。
IDは仮です。実際はDB構造に従って削除したいものを特定できるようにしてください。

idの箇所はパラメタの値としてセットするものにしてください。
(テキストボックスの値など・・・。)

追記

下のコメントで、
Form1で選択したDataGridViewRowが、Dgvに保持されていることがわかりましたが、
この中にidは存在するのでしょうか?
存在しない場合はDataGridViewの行を生成しているところから見直す必要があると思います。

存在する場合は下記のようにするとよいと思います。
列名がわからないのでDgv.Cells[]に指定する添え字は"id"としていますが、適宜修正してください。
分からなければブレイクポイントを置いて確認してください。

csharp

1// SQLの準備 2command.CommandText = @"DELETE MEMBER_MASTER WHERE id = @id"; 3string id = Dgv.Cells["id"].Value.ToString(); 4command.Parameters.Add(new SqlParameter("@id", id)); 5 6// SQLの実行 7command.ExecuteNonQuery();

投稿2019/01/15 03:10

編集2019/01/15 06:51
runny_nose

総合スコア280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maam

2019/01/15 04:04

runny_noseさん ご回答ありがとうございます! DB構造は以下です。   | カラム名 ========== ID id 姓 name1 名 name2 生年月日 birthday 性別 gender 郵便番号 post_code 住所 adress Form2には、カラムごとにテキストボックスやコンボボックスに情報がセットされます。 (例:name1はTextBox1に表示) ちなみにIDはForm2上では表示されず、BD上だけで登録・表示されています。 この場合でも、 @"DELETE MEMBER_MASTER WHERE ID = @ID" でよろしいでしょうか
runny_nose

2019/01/15 04:43

フォーム上に表示している/していないは関係ないです。 削除するSQL文を実行する上でキーになる情報は必要なのですから、IDがユニークキーとなるなら、 当然IDを指定する必要があります。 IDはForm1のDataGridViewの行データ中にも存在しないのでしょうか? 存在するならForm2のコンストラクタにDataGridViewの選択行のデータを渡しているようなので、 そこからIDを抽出して退避しておき、それを@IDのパラメタに指定するような形になると思います。 どのようなコンストラクタなのか、どのような型をコンストラクタに渡しているか、など情報が不足しているため、これ以上回答しようがありません。 (ちなみに「BD」ではなく、DBです。DBはDataBaseの略です。 件名のみのタイポと思いきや、上のコメントでも間違われているので・・・。)
maam

2019/01/15 05:17

ご回答ありがとうございます。 主キーであるidで指定することがわかりました。 「idの箇所はパラメタの値としてセットするものにしてください。 (テキストボックスの値など・・・。)」というご説明を もうちょっと詳しく教えていただいてもよろしいですか。 質問ばかりですみません。
runny_nose

2019/01/15 06:10

分かりずらい文章ですみません。 command.Parameters.Add(new SqlParameter("@ID", id)); の、 SqlParameterのコンストラクタに渡している2番目の引数である「id」は提示されているソース内のどこにもない変数を適当に書いているだけなので、 そのまま書けば動くというわけではないです。 実際に削除したいレコードのidをどこかから取得してセットしてください。 どこから取得すればいいのか?ということなら、現状では情報が不足していますので、 もうちょっと詳しく教えていただいてもよろしいですか。 せめてForm2のコンストラクタだけでも見せてもらえたらと思います。 質問ばかりなことは全然かまいませんよ!謝る必要ありません!teratailはそういうサイトなのですからw ただ、質問だけではなく答えるのに必要な情報をしっかり提示することは大事と思います。
maam

2019/01/15 06:24

ご丁寧に回答いただいて本当にありがとうございます。 以下にForm2の現状を貼ります。 中途半端な状態ですので、何かアドバイスをいただければと思います… public Form2(DataGridViewRow dgv) { Dgv = dgv; InitializeComponent(); } //行データ private DataGridViewRow Dgv = new DataGridViewRow(); private void Form2_Load(object sender, EventArgs e) { textSei.Text = Dgv.Columns[ ].Value.ToString(); textMei.Text = Dgv.Columns[ ].Value.ToString(); comboBox1.Text = Dgv.Columns[ ].Value.ToString(); comboBox2.Text = Dgv.Columns[ ].Value.ToString(); comboBox3.Text = Dgv.Columns[ ].Value.ToString(); if (Dgv.Columns[4] == "男性") { manBt.Checked = true; } else { womanBt.Checked = true; } textYuubin1.Text = Dgv.Columns[ ].Value.ToString(); textYuubin2.Text = Dgv.Columns[ ].Value.ToString(); textJyusyo.Text = Dgv.Columns[6].Value.ToString();
runny_nose

2019/01/15 06:38

DataGridViewRowにColumnsなんてありましたっけ?Cellsじゃないでしょうか? [ ]も空白なのはなぜでしょう」・・・。
maam

2019/01/15 06:56

CellsにしたらColumnsのエラーがなくなりました!ありがとうございます>< []が空白なのは DataGridViewの1つのCellsの情報を2分割にしたいため、どうすればよいか検討中だからです。 例えばDgv.Cells[1]は名前(山田太郎)とすると textSei.Text には山田 textMei.Textには太郎 と表示させたいのです。
runny_nose

2019/01/15 07:10

上の回答に追記したように、まずはidがDataGridViewRowに含まれているのかどうかを確認してください。 含まれているのなら、それをSqlParameterにセットすればいいだけです。
maam

2019/01/15 07:17

// SQLを実行し、dataGridViewに格納する using (var reader = command.ExecuteReader()) { while (reader.Read() == true) { string post_code = reader["post_code"]as string; //"post_code"を変数に入れる dataGridView1.Rows.Add(reader["id"], (reader["name1"] as string) + " " + (reader["name2"] as string), reader["birthday"], Convert.ToInt32(reader["gender"]) == 1 ? "男性" : "女性", post_code.Substring(0, 3) + "-" + post_code.Substring(3, 4), reader["adress"] as string); } 上記のようにDataGridViewに格納しているのでidは含まれているはずです。 ですが、”idが見つかりません”とエラーになってしまいました。
runny_nose

2019/01/15 07:32 編集

"id"が見つからないのはDataGridViewに列情報(Column)が設定されていないためではないでしょうか? 下記のように事前にForm1のDataGridViewに対して列の情報を定義してみてください。 dataGridView.Columns.Add("id", "生徒ID"); // 第一引数は列の識別名(こうすると~.Cells["id"]で取得できる) dataGridView.Columns.Add("name1", "姓"); // 第二引数は列ヘッダに表示するテキスト dataGridView.Columns.Add("name2", "名"); // 同様にbirthday、gender・・・と続く。順番に注意。   ・   ・   ・ もしくはインデックスでも取得できるので、 string id = Dgv.Cells[0].Value.ToString(); とするのでもいいと思います。
maam

2019/01/15 07:34

string id = Dgv.Cells[0].Value.ToString(); でできました!本当にありがとうございます! お時間を使わせてしまい申し訳ございません…。 あとは更新処理も作成しないといけないので引き続き頑張ります。 本当にありがとうございました!
runny_nose

2019/01/15 07:36

また、VisualStudioを使われているのならブレークポイントを置いておくことで、変数の中身を確認できますので、Dgv.Cellsの中身を覗いてみましょう。 ・string id = Dgv.Cells["id"].Value.ToString();の行にカーソルを置いてF9 ・実行する ・ブレークポイントで止まったらDgv.CellsのCellsの部分にマウスカーソルを合わせる。 ⇒内容や、値を取得するための添え字が確認できるはず
maam

2019/01/15 07:51

やってみました。値がでてきました。このようにデバック機能を使用するのですね。 何から何までありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問