private void Page_Load(object sender, System.EventArgs e) { // ページを初期化するユーザー コードをここに挿入します。 // SubmitPanelを表示する DeletePanel.Visible = false; SubmitPanel.Visible = true; // 商品IDを取得する int productid; try { productid = int.Parse(Request.QueryString["ID"]); } catch (ArgumentNullException) { // 商品IDが指定されていない SubmitMessage.Text = "商品番号が指定されていません"; return; } catch (FormatException) { // 書式が不正 SubmitMessage.Text = "商品番号が不正です"; return; } catch (OverflowException) { // オーバーフロー SubmitMessage.Text = "商品番号が不正です"; return; } catch (Exception ex) { // その他のエラー SubmitMessage.Text = "不明なエラーです"; Response.AppendToLog(ex.Message); return; } // DeletePanelを表示する DeletePanel.Visible = true; SubmitPanel.Visible = false; // ポストバック状態かどうかを調べる if (this.IsPostBack) { // ポストバック状態である // データベースへの削除処理 if (DeleteDB(productid)) { // 更新に成功した // SubmitPannelのほうを表示する DeletePanel.Visible = false; SubmitPanel.Visible = true; // 成功メッセージを設定 SubmitMessage.Text = "商品を削除しました"; } } else { // 非ポストバック状態である // 現在のデータベースの情報をWebフォームの各ラベルに表示する ViewProductData(productid); } } private void ViewProductData(int productid) { // 現在のデータを表示する // データベースに接続して該当のレコードを得る SqlConnection sqlconn = new SqlConnection(ConfigurationSettings.AppSettings["DSNSTRING"]); // SELECT文を送信するSqlCommandオブジェクトを用意する SqlCommand sqlcmd = new SqlCommand( "SELECT id, productname, comment, createdate, lastupdate FROM Products" + " WHERE id=@id", sqlconn); // パラメータを設定する sqlcmd.Parameters.Add("@id", SqlDbType.Int).Value = productid; // 実行する SqlDataReader sqlreader = null; try { // 接続を開く sqlconn.Open(); // SELECT文を実行する sqlreader = sqlcmd.ExecuteReader(); // レコードの値を取得する if (sqlreader.Read()) { // レコードが存在する // ラベルに、実際の値を設定する ProductNameLabel.Text = Server.HtmlEncode(sqlreader.GetString(1)); CreatedateLabel.Text = Server.HtmlEncode(string.Format("登録日 {0:yyyy/MM/dd}", sqlreader.GetDateTime(3))); LastupdateLabel.Text =Server.HtmlEncode(string.Format("最終更新日 {0:yyyy/MM/dd}", sqlreader.GetDateTime(4))); // 現在のlastupdate列の値をVIEWSTATEに埋め込む System.Data.SqlTypes.SqlDateTime lastupdate = sqlreader.GetSqlDateTime(4); this.ViewState["lastupdate_day"] = lastupdate.DayTicks; this.ViewState["lastupdate_time"] = lastupdate.TimeTicks; CommentLabel.Text = Server.HtmlEncode(sqlreader.GetString(2)); } else { // レコードが存在しない ErrorMessage.Text = "該当の商品がありません"; } } catch (SqlException ex) { // エラーが発生した Response.AppendToLog(ex.Message); ErrorMessage.Text = "申し訳ございません。データベースエラーのため処理を完了できませんでした"; } finally { // 接続を閉じる if (sqlreader != null) { sqlreader.Close(); } sqlconn.Close(); } } private bool DeleteDB(int productid) { // レコードを削除する // コネクションを準備する SqlConnection sqlconn = new SqlConnection(ConfigurationSettings.AppSettings["DSNSTRING"]); // SqlCommandオブジェクトを用意する SqlCommand sqlcmd = new SqlCommand( "DELETE FROM Products WHERE id=@id and lastupdate=@oldlastupdate", sqlconn); // パラメータを設定する // 更新となるレコードのID番号 sqlcmd.Parameters.Add("@id", SqlDbType.Int).Value = productid; // 更新日時 int daytick, timetick; daytick = (int)this.ViewState["lastupdate_day"]; timetick = (int)this.ViewState["lastupdate_time"]; System.Data.SqlTypes.SqlDateTime oldlastupdate = new System.Data.SqlTypes.SqlDateTime (daytick, timetick); sqlcmd.Parameters.Add("@oldlastupdate", SqlDbType.DateTime).Value = oldlastupdate; // データベースに対して更新をかける int recnum = -1; try { // 接続を開く sqlconn.Open(); // UPDATE文を実行する recnum = sqlcmd.ExecuteNonQuery(); } catch (SqlException ex) { // 何らかのエラーが発生した // エラーをIISのログに記録しておくことにする Response.AppendToLog(ex.Message); } finally { // 接続を閉じる sqlconn.Close(); } if (recnum == 1) { // 更新に成功した return true; } else { // 更新に失敗した ErrorMessage.Text = "データベースへの書き込みに失敗しました"; return false; } }