Member 12461669 Ответов: 2

Моя команда deletecommand может выполняться, но данные не могут быть удалены?


У меня есть проблема в том, что "я не знаю, что не так с моим кодом. Код может быть выполнен, но мои данные не могут быть удалены.
Вот мой код:

Что я уже пробовал:

private void DeleteCmd(object sender, EventArgs e)
            {
                conn = new SqlConnection("Server=TA;Data Source=TA; Database=dbSaham;Integrated Security=SSPI");
                conn.Open();
                string sql = "";
                ds = new DataSet();
                da = new SqlDataAdapter();
                DialogResult hsl = MessageBox.Show("Anda Yakin ?", "Hapus", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                if (hsl == DialogResult.Yes)
                {
                    sql = String.Concat("Delete From UNICJK Where Date = '", dateTimePicker4.Value.Date.ToString(), "'");
                }
                da.DeleteCommand = new SqlCommand(sql, conn);
                string pesan = String.Concat(da.DeleteCommand.ExecuteNonQuery(), " Record berhasil dihapus");
                MessageBox.Show(pesan, "Info Hapus");
                dgvSaham.Visible = true;
                SqlCommand cmd2 = new SqlCommand("Select * From UNICJK", conn);
                da.SelectCommand = cmd2;
                da.Fill(ds, "UNICJK");
                dgvSaham.DataSource = ds.Tables["UNICJK"];
            }

CHill60

Похоже, что вы не выполняете команду SqlCommand, которая выполняет удаление. Единственный раз, когда вы делаете окружной прокурор.Заполнение происходит после установки команды SelectCommand

[no name]

Если вы сохраняете даты в своей базе данных в виде строк, а не дат, то это, скорее всего, ваша проблема.

2 Ответов

Рейтинг:
1

Patrice T

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]

Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик - Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 12461669

спасибо за ваше предложение, но я не могу сделать отладку, я не знаю, как это сделать, но я скоро научусь этому.

Рейтинг:
0

Jochen Arndt

Ваш Date столбец имеет, вероятно, следующий тип DATETIME. Когда затем передается только строка даты с использованием dateTimePicker4.Value.Date.ToString(), который будет продлен до DATETIME с частью времени, установленной на 00:00:00, и только те записи совпадают, которые имеют это время.

Вы должны указать, что хотите сравнить только часть даты:

sql = String.Concat("DELETE FROM UNICJK WHERE CAST(Date AS DATE) = '", dateTimePicker4.Value.Date.ToString(), "'");

В вашем случае было бы еще лучше использовать параметризованную команду, чтобы избежать передачи дат, отформатированных в виде строк:
da.DeleteCommand = new SqlCommand("DELETE FROM UNICJK WHERE CAST(Date AS DATE) = CAST(@PickerDate AS DATE)", conn);
da.DeleteCommand.Parameters.AddWithValue("@PickerDate", dateTimePicker4.Value)


Richard Deeming

Было бы еще лучше, если бы вы сделали запрос Саргабельным! :)

DELETE FROM UNICJK WHERE Date >= @PickerDate And Date < DateAdd(day, 1, @PickerDate)

Jochen Arndt

Вы правы.
Но на самом деле я не уверен, что временная часть всегда равна нулю для выбора даты.
Но это не должно быть проблемой, чтобы использовать промежуточную переменную с временем, установленным в ноль тогда.

Richard Deeming

Если вы установите значение параметра равным dateTimePicker4.Value.Date, временная часть будет равна нулю. :)