Попытка выполнить обновление от конкретного пользователя GridView базы данных (OleDbCommand)

Привет, ребята, я работаю с пользователями GridView Database Upade, и у меня проблема с моей строкой обновления. Она сообщает мне, когда я нажимаю на обновление, строка обновляется успешно, но на самом деле не обновляет ее :(

Коды:

1 Asp.net(OleDB)

 protected void AdminBook_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    try
    {
        using (OleDbConnection sqlCon = new OleDbConnection(connectionStr))
        {
            sqlCon.Open();
            string query = "UPDATE Users SET FirstName=@FirstName,LastName=@LastName,UserPass=@UserPass,Gender=@Gender,Birthday=@Birthday,Email=@Email WHERE UserID=@id";
            OleDbCommand sqlCmd = new OleDbCommand(query, sqlCon);
            sqlCmd.Parameters.AddWithValue("@FirstName", (AdminBook.Rows[e.RowIndex].FindControl("txtFirstName") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@LastName", (AdminBook.Rows[e.RowIndex].FindControl("txtLastName") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@UserPass", (AdminBook.Rows[e.RowIndex].FindControl("txtUserPass") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@Gender", (AdminBook.Rows[e.RowIndex].FindControl("txtGender") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@Birthday", (AdminBook.Rows[e.RowIndex].FindControl("txtBirthday") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@Email", (AdminBook.Rows[e.RowIndex].FindControl("txtEmail") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@UserName", (AdminBook.Rows[e.RowIndex].FindControl("txtUserName") as TextBox).Text.Trim());
            sqlCmd.Parameters.AddWithValue("@id", Convert.ToInt32(AdminBook.DataKeys[e.RowIndex].Value.ToString()));
            sqlCmd.ExecuteNonQuery();
            AdminBook.EditIndex = -1;
            PopulateGridView();
            lblSuccessMessage.Text = "עריכת הנתונים התבצעה בהצלחה";
            lblErrorMessage.Text = "";
        }
    }
    catch (Exception ex)
    {
        lblSuccessMessage.Text = "";
        lblErrorMessage.Text = ex.Message;
    }
}

2 HTML (очень короткий)

    <asp:GridView ID="AdminBook" runat="server" AutoGenerateColumns="False" 
      ShowFooter="True" DataKeyNames="UserID"
            ShowHeaderWhenEmpty="True"

            OnRowCommand="AdminBook_RowCommand" OnRowEditing="AdminBook_RowEditing" OnRowCancelingEdit="AdminBook_RowCancelingEdit"
            OnRowUpdating="AdminBook_RowUpdating" OnRowDeleting="AdminBook_RowDeleting"

            BackColor="White" BorderColor="#999999" BorderStyle="Solid" 
      BorderWidth="1px" CellPadding="3" ForeColor="Black" GridLines="Vertical">

Представьте, что вы видите это: Здесь вы можете видеть, что он показывает сообщение об успешном завершении

Пожалуйста, помогите мне... Потому что он делает это успешно, но не обновляет базу данных :(


person Alex    schedule 02.12.2018    source источник
comment
Параметр @UserName кажется нигде не назначенным, можете ли вы подтвердить, какие значения хранятся в массиве cmd.Parameters? Поскольку вы используете OleDbCommand, важен порядок параметров, а не имя параметра.   -  person Tetsuya Yamamoto    schedule 03.12.2018


Ответы (1)


Основная проблема вашего запроса в том, что наличие этого определения параметра:

sqlCmd.Parameters.AddWithValue("@UserName", (AdminBook.Rows[e.RowIndex].FindControl("txtUserName") as TextBox).Text.Trim());

который не существует в строке запроса, которая имеет 7 параметров вместо 8, определенных cmd.Parameters.Add():

UPDATE Users SET FirstName=@FirstName,LastName=@LastName,UserPass=@UserPass,Gender=@Gender,Birthday=@Birthday,Email=@Email WHERE UserID=@id

Обратите внимание, что OLE DB не распознает именованные параметры, он распознает только позиционные параметры (вместо этого параметры запроса обрабатываются в порядке их определения) . При текущем порядке в вашем коде параметр UserName может быть ошибочно назначен как id, и, поскольку предоставленное значение не совпадает ни с одним из значений, хранящихся в столбце UserID, данные не обновляются.

Следовательно, вы должны удалить указанную выше строку, чтобы параметры запроса точно совпадали с их порядком, присутствующим внутри строки запроса:

string query = "UPDATE Users SET FirstName=@FirstName,LastName=@LastName,UserPass=@UserPass,Gender=@Gender,Birthday=@Birthday,Email=@Email WHERE UserID=@id";

OleDbCommand sqlCmd = new OleDbCommand(query, sqlCon);

sqlCmd.Parameters.AddWithValue("@FirstName", (AdminBook.Rows[e.RowIndex].FindControl("txtFirstName") as TextBox).Text.Trim());
sqlCmd.Parameters.AddWithValue("@LastName", (AdminBook.Rows[e.RowIndex].FindControl("txtLastName") as TextBox).Text.Trim());
sqlCmd.Parameters.AddWithValue("@UserPass", (AdminBook.Rows[e.RowIndex].FindControl("txtUserPass") as TextBox).Text.Trim());
sqlCmd.Parameters.AddWithValue("@Gender", (AdminBook.Rows[e.RowIndex].FindControl("txtGender") as TextBox).Text.Trim());
sqlCmd.Parameters.AddWithValue("@Birthday", (AdminBook.Rows[e.RowIndex].FindControl("txtBirthday") as TextBox).Text.Trim());
sqlCmd.Parameters.AddWithValue("@Email", (AdminBook.Rows[e.RowIndex].FindControl("txtEmail") as TextBox).Text.Trim());
sqlCmd.Parameters.AddWithValue("@id", Convert.ToInt32(AdminBook.DataKeys[e.RowIndex].Value.ToString()));

Или добавьте столбец UserName перед предложением WHERE без изменения порядка параметров:

string query = "UPDATE Users SET FirstName=@FirstName,LastName=@LastName,UserPass=@UserPass,Gender=@Gender,Birthday=@Birthday,Email=@Email,
                UserName=@UserName WHERE UserID=@id";
person Tetsuya Yamamoto    schedule 03.12.2018
comment
Большое спасибо, мне помогло! Ваши ответы идеальны! Отличная работа! Это была большая ошибка и очень глупая ошибка с моей стороны :( Большое спасибо! - person Alex; 03.12.2018
comment
Алекс, я буду очень рад, если вы поможете мне с моей новой проблемой: stackoverflow.com/questions/53599085/ - person Alex; 03.12.2018