Я работаю над приложением C# по добавлению администратора в базу данных. Я могу выбрать строку данных из сетки, и сведения о выбранной строке отображаются в текстовых полях для редактирования. Однако когда я меняю текстовые поля и нажимаю кнопку «Обновить», я получаю эту ошибку:
Выберите запись для обновления
хотя я уже выбрал строку и данные в форме отображаются правильно. Мой SQL-сервер работает правильно.
Это код моего обновления и выбора строки:
private void adminview_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex != -1 && e.ColumnIndex != -1)
{
mobile = Convert.ToInt32(adminview.Rows[e.RowIndex].Cells[4].Value);
}
else
{
MessageBox.Show("Invalid cell selected.");
}
if (e.RowIndex >= 0)
{
DataGridViewRow row = adminview.Rows[e.RowIndex];
aname.Text = row.Cells["username"].Value.ToString();
amobile.Text = row.Cells["mobile"].Value.ToString();
adate.Value = Convert.ToDateTime(row.Cells["birth"].Value);
pw.Text = row.Cells["password"].Value.ToString();
if (row.Cells["gender"].Value.ToString() == "Male")
{
amale.Checked = true;
afemale.Checked = false;
}
else if (row.Cells["gender"].Value.ToString() == "Female")
{
afemale.Checked = true;
amale.Checked = false;
}
}
}
private void update_Click(object sender, EventArgs e)
{
if (adminview.SelectedRows.Count > 0)
{
name = aname.Text;
mobile = Convert.ToInt32(amobile.Text);
dob = adate.Value.ToString("yyyy-MM-dd");
passw = pw.Text;
if (amale.Checked == true)
{
gender = "Male";
}
else if (afemale.Checked == true)
{
gender = "Female";
}
conn.Open();
SqlCommand cmd = new SqlCommand("UPDATE admin SET name = '" + name + "', password = '" + passw + "', gender = '" + gender + "', birth = '" + dob + "' WHERE mobile = '" + mobile + "'", conn);
cmd.ExecuteNonQuery();
MessageBox.Show("Details updated");
conn.Close();
Display(); //data show in grid
}
else
{
MessageBox.Show("Select a record to update.");
}
}
Я ожидаю, что мои данные в базе данных будут обновлены, а строки в сетке будут выбраны правильно.
Пожалуйста, используйте параметры вместо построения значений в командной строке. Найдите «sql-инъекцию»
Если вы знаете тип своих данных в DataGridView
, приведите результат, не конвертируйте его. Используйте (DateTime)row.Cells["birth"].Value
вместо Convert.ToDateTime(row.Cells["birth"].Value)
и (string)row.Cells["username"].Value
вместо row.Cells["username"].Value.ToString()
.
после перевода кода в более читаемый формат, сможете ли вы обнаружить одну или несколько ошибок?
Несвязано: не сохраняйте пароли, даже «только для изучения». Это никогда не нормально. Если вам все равно, не имейте их. Если да, научитесь делать это с самого начала.
Проблема, скорее всего, связана с неправильной проверкой выбранной строки. Замените adminview.SelectedRows.Count > 0 на adminview.CurrentCell != null в вашем методе update_Click. Это гарантирует, что вы пытаетесь обновить только тогда, когда выбрана одна строка.
Не могли бы вы разъяснить свой ответ?
Проблема, скорее всего, связана с неправильной проверкой выбранной строки. Замените adminview.SelectedRows.Count > 0 на adminview.CurrentCell != null в вашем методе update_Click. Это гарантирует, что вы пытаетесь обновить только тогда, когда выбрана одна строка.
Пожалуйста, укажите это в своем ответе. Комментарии следует рассматривать как эфемерные.
Вместо того, чтобы полагаться на SelectedRows.Count, вы можете отслеживать выбранную строку в методе adminview_CellContentClick, используя переменную уровня класса, в которой хранится индекс выбранной строки. Затем используйте эту переменную для обновления записи.
Я также обновил SqlCommand в коде, чтобы использовать параметры (@name, @passw и т. д.), чтобы предотвратить SQL-инъекцию. Всегда полезно использовать параметры в SQL-запросах.
Попробуйте так. Обновление будет работать.
private void update_Click(object sender, EventArgs e)
{
if (adminview.CurrentCell != null && mobile != 0)
{
name = aname.Text;
mobile = Convert.ToInt32(amobile.Text.TrimStart('0'));
dob = adate.Value.ToString("yyyy-MM-dd");
passw = pw.Text;
if (amale.Checked)
{
gender = "Male";
}
else if (afemale.Checked)
{
gender = "Female";
}
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("UPDATE admin SET username = @username, password = @password, gender = @gender, birth = @birth WHERE mobile = @mobile", conn);
cmd.Parameters.AddWithValue("@username", name);
cmd.Parameters.AddWithValue("@password", passw);
cmd.Parameters.AddWithValue("@gender", gender);
cmd.Parameters.AddWithValue("@birth", dob);
cmd.Parameters.AddWithValue("@mobile", mobile);
cmd.ExecuteNonQuery();
conn.Close();
Display();
MessageBox.Show("Details Updated.");
}
catch (Exception ex)
{
MessageBox.Show("Error updating record: " + ex.Message);
}
}
else
{
MessageBox.Show("Select a record to update.");
conn.Close();
}
}
чем ты. это работа для обновления моих данных
Попробуйте так. Выбор строки можно выполнить с помощью этого кода.
private void adminview_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = adminview.Rows[e.RowIndex];
string mobileStr = row.Cells["mobile"].Value.ToString();
if (int.TryParse(mobileStr.TrimStart('0'), out mobile))
{
aname.Text = row.Cells["username"].Value.ToString();
amobile.Text = mobileStr;
adate.Value = (DateTime)row.Cells["birth"].Value;
pw.Text = row.Cells["password"].Value.ToString();
if (row.Cells["gender"].Value.ToString() == "Male")
{
amale.Checked = true;
afemale.Checked = false;
}
else
{
afemale.Checked = true;
amale.Checked = false;
}
}
}
else
{
MessageBox.Show("Invalid cell selected.");
}
}
Спасибо. Теперь я могу правильно выбрать строку.
Судя по всему, в вашем административном окне 0 SelectedRows. Можете ли вы придумать причину, почему?