C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: datagrid右クリック→削除選択→実行 w


(過去ログ 41 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■21539 / inTopicNo.1)  datagrid右クリック→削除選択→実行 where句指定
  
□投稿者/ t6_kana (13回)-(2008/07/03(Thu) 20:44:54)

分類:[C#] 

2008/07/04(Fri) 13:07:25 編集(投稿者)
2008/07/04(Fri) 13:07:22 編集(投稿者)

こんばんは。標記の件で調べています。

下記ソースで、値は取得できるのですが、このwhere句の指定で取得してきた値を
deleteしたいのですが、where句にはどのような指定をしたらいいのでしょうか。
この指定が難しいです。
何か良いサイトや本がありましたら、合わせてご紹介下さい(__)

以上宜しくお願いします。


  //削除メニュクリック
newcontitem2.Click += delegate
{

int nowRow = dataGridView1.CurrentRow.Index;

//データグリッドから値を取得
string id = dataGridView1.Rows[nowRow].Cells[0].Value.ToString();

   :
  decimal salary = decimal.Parse(dataGridView1.Rows[nowRow].Cells[6].Value.ToString());

string sex = dataGridView1.Rows[nowRow].Cells[7].Value.ToString();

 
  string StrConn = @" server =***** ; ; ";
SqlConnection cnc = new SqlConnection(StrConn);
cnc.Open();

using (SqlTransaction trn = cnc.BeginTransaction())
{
try
{
★間違ってます。★SqlCommand cmd = new SqlCommand("DELETE FROM user_master WHERE id =this.id and userid=this.userid and username=this.username and password=this.password and age=this.age and birth=this.birth and salary=this.salary and sex=this.sex ", cnc, trn);

cmd.ExecuteNonQuery();
trn.Commit();
}
catch (Exception ex)
{
trn.Rollback();
MessageBox.Show("処理を中断します。" + ex.Message);
}

cnc.Close();

user_master um = new user_master();
this.Hide();
um.ShowDialog();
}
};
cntmenu1.Items.Add(newcontitem1);
cntmenu1.Items.Add("-");
cntmenu1.Items.Add(newcontitem2);
this.ContextMenuStrip = cntmenu1;
引用返信 編集キー/
■21544 / inTopicNo.2)  Re[1]: datagrid右クリック→削除選択→実行 where句指定
□投稿者/ Jitta on the way (127回)-(2008/07/04(Fri) 07:43:56)
No21539 (t6_kana さん) に返信

簡単なのは文字列に埋め込むことですが、それをやると今流行りの SQL インジェクションを作り込むことになります。
「パラメタライズド クエリ」を使います。
引用返信 編集キー/
■21547 / inTopicNo.3)  Re[2]: datagrid右クリック→削除選択→実行 where句指定
□投稿者/ ロック (31回)-(2008/07/04(Fri) 09:09:13)
これは、削除対象のテーブルにユニークな値が無いのでWHERE句の指定が
難しいということでしょうか?
で、あれば簡単なのはIDのようなフィールドを作ってIDENTITYプロパティを指定
するのが一番簡単だと思います。
テーブルをいじれないのなら、フィールドから必ずユニークになる
組み合わせを探すくらいしか自分には思いつかないですね・・・

#でも、良く見るとidというフィールドがあるようなのでそれがユニークな値なら、
#idだけ指定で良いんじゃないのかな〜とか思いつつも、的を外している
#気もしてきました。

あとは、Jitta on the wayさんが書いている通り「パラメタライズド クエリ」で
検索すると良いと思います。
今の処理だとthis.idとかをSQL文で渡しても、それがそのままSQL文として
実行されるだけで、実際のthis.idの値に置き換わる事はありませんので・・

引用返信 編集キー/
■21553 / inTopicNo.4)  Re[3]: datagrid右クリック→削除選択→実行 where句指定
□投稿者/ いしだ (150回)-(2008/07/04(Fri) 11:59:04)
2008/07/04(Fri) 11:59:54 編集(投稿者)

投稿場所間違いの為、削除
引用返信 編集キー/
■21554 / inTopicNo.5)  Re[1]: datagrid右クリック→削除選択→実行 where句指定
□投稿者/ いしだ (151回)-(2008/07/04(Fri) 12:00:06)
where句の条件に使用する値は変数に持っているという事ですよね?
となると多分以下のような感じになります。

SqlCommand cmd = new SqlCommand("DELETE FROM user_master WHERE id ='" + this.id + "' and userid='" + this.userid + "' and username='" + this.username + "' and password='" + this.password + "' and age=" + this.age.ToString() .... 略

で、次にJittaさんの話になっていきますね。
上のやり方は推奨されません。
SQLインジェクションについて調べてみてください。

SqlCommand cmd = new SqlCommand("DELETE FROM user_master WHERE id =@id and userid=@userid and username=@username and ....... 略
cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
cmd.Parameters.Add("@userid", SqlDbType.VarChar).Value = userid;
cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username;
.... 略
引用返信 編集キー/
■21565 / inTopicNo.6)  Re[2]: datagrid右クリック→削除選択→実行 w
□投稿者/ t6_kana (15回)-(2008/07/04(Fri) 13:26:19)
2008/07/04(Fri) 13:40:31 編集(投稿者)

皆さん。ありがとうございました。

ID列がユニークのためそれを指定して、パラメータークエリで処理
しました。
今後SQLSERVERに関してもさらに勉強していきますので、宜しくお願いし
します。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -