Событие Gridview RowUpdating с использованием хранимых процедур не обновляет фактическую базу данных? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть Gridview, где я пытаюсь отредактировать свои данные, нажав кнопку редактирования в Gridview и подняв обработчик события RowUpdating.

Когда я нажимаю кнопку обновления в строке Gridview, я не получаю ошибок, но данные в Gridview остаются такими же, как до нажатия кнопки «Изменить / обновить», а также данные в базе данных

  • Я проверил, действительно ли работает моя хранимая процедура.
  • Я использовал точки останова, и все данные верны.
  • Я сделал те же методы / процедуры для удаления строки из таблицы и базы данных, и они сработали.
  • Я проверил if (!IsPostback)

Вот моя хранимая процедура:

CREATE PROCEDURE [dbo].UpdateReview
    @theID int,
    @theDate datetime,
    @theReview varchar(max),
    @theFood int, 
    @theService int, 
    @theAtmos int, 
    @thePrice int
AS
    SET @theDate = GETDATE();

BEGIN
    UPDATE Reviews 
    SET 
        ReviewDate = @theDate,
        ReviewText = @theReview, 
        FoodQuality = @theFood, 
        ServiceRating = @theService, 
        AtmosphereRating = @theAtmos, 
        PriceRating = @thePrice
    WHERE ReviewID = @theID
END

Вот мой метод выполнения хранимой процедуры:

public void UpdateReview(int id, string review, int food, int service, int atmos, int price)
        {
            DBConnect objDB = new DBConnect();
            objCmd.Parameters.Clear();
            objCmd.CommandType = CommandType.StoredProcedure;
            objCmd.CommandText = "UpdateReview";

            objCmd.Parameters.AddWithValue("@theID", id);
            objCmd.Parameters.AddWithValue("@theReview", review);
            objCmd.Parameters.AddWithValue("@theFood", food);
            objCmd.Parameters.AddWithValue("@theService", service);
            objCmd.Parameters.AddWithValue("@theAtmos", atmos);
            objCmd.Parameters.AddWithValue("@thePrice", price);

            objDB.GetConnection();
            objDB.DoUpdateUsingCmdObj(objCmd);
            objDB.CloseConnection();
        }

Я использую свой собственный класс подключения: GitHub

Вот мой обзор сетки:

<asp:GridView ID="gvMyReviews" runat="server" AutoGenerateColumns="false" OnRowEditing="gvMyReviews_RowEditing" OnRowUpdating="gvMyReviews_RowUpdating" OnRowCancelingEdit="gvMyReviews_RowCancelingEdit" OnRowDeleting="gvMyReviews_RowDeleting" >
            <Columns>
                <asp:BoundField DataField="ReviewID" HeaderText="ID" ReadOnly="true" />
                <asp:BoundField DataField="UserID" HeaderText="User ID" ReadOnly="true" />
                <asp:BoundField DataField="RestName" HeaderText="Restaurant" ReadOnly="true" />
                <asp:BoundField DataField="ReviewDate" HeaderText="Date of Review" DataFormatString="{0:d}" ReadOnly="true" />
                <asp:BoundField DataField="FoodQuality" HeaderText="Food Quality" />
                <asp:BoundField DataField="ServiceRating" HeaderText="Service" />
                <asp:BoundField DataField="AtmosphereRating" HeaderText="Atmosphere" />
                <asp:BoundField DataField="PriceRating" HeaderText="Price" />
                <asp:BoundField DataField="ReviewText" HeaderText="Review" />
                <asp:CommandField HeaderText="Modify" ShowEditButton="true" ControlStyle-CssClass="button2" />
                <asp:CommandField HeaderText="Remove" ShowDeleteButton="true" ControlStyle-CssClass="button2" />
            </Columns>
        </asp:GridView>

Вот мой фактический код:

protected void gvMyReviews_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gvMyReviews.EditIndex = e.NewEditIndex;
            DataSet ds = p.GetReviewsByUserID(200);
            gvMyReviews.DataSource = ds;
            gvMyReviews.DataBind();
        }

        protected void gvMyReviews_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int index = e.RowIndex;
            int reviewID = int.Parse(gvMyReviews.Rows[index].Cells[0].Text);

            TextBox txtFoodRating = (TextBox)gvMyReviews.Rows[index].Cells[4].Controls[0];
            int foodRating = int.Parse(txtFoodRating.Text);

            TextBox txtServiceRating = (TextBox)gvMyReviews.Rows[index].Cells[5].Controls[0];
            int serviceRating = int.Parse(txtServiceRating.Text);

            TextBox txtAtmosphereRating = (TextBox)gvMyReviews.Rows[index].Cells[6].Controls[0];
            int atmosphereRating = int.Parse(txtAtmosphereRating.Text);

            TextBox txtPriceRating = (TextBox)gvMyReviews.Rows[index].Cells[7].Controls[0];
            int priceRating = int.Parse(txtPriceRating.Text);

            TextBox txtReview = (TextBox)gvMyReviews.Rows[index].Cells[8].Controls[0];
            string strReview = txtReview.Text;

            p.UpdateReview(reviewID, strReview, foodRating, serviceRating, atmosphereRating, priceRating);

            gvMyReviews.EditIndex = -1;

            DataSet ds = p.GetReviewsByUserID(200);
            gvMyReviews.DataSource = ds;
            gvMyReviews.DataBind();
        }

        protected void gvMyReviews_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gvMyReviews.EditIndex = -1;
            DataSet ds = p.GetReviewsByUserID(200);
            gvMyReviews.DataSource = ds;
            gvMyReviews.DataBind();
        }

1 Ответ

0 голосов
/ 21 марта 2019

, даже если вы устанавливаете значение @theDate в sp, вам нужно добавить параметр @theDate через команду. в противном случае вы должны изменить sp на как показано ниже.

CREATE PROCEDURE [dbo].UpdateReview
    @theID int,
    @theReview varchar(max),
    @theFood int, 
    @theService int, 
    @theAtmos int, 
    @thePrice int
AS
BEGIN
    UPDATE Reviews 
    SET 
        ReviewDate = GETDATE(),
        ReviewText = @theReview, 
        FoodQuality = @theFood, 
        ServiceRating = @theService, 
        AtmosphereRating = @theAtmos, 
        PriceRating = @thePrice
    WHERE ReviewID = @theID
END
...