Рейтинг:
14
Richard Deeming
Вы не указали значение для этого параметра.
cmd.Parameters.Add(new SqlParameter("@id", System.Data.SqlDbType.Int) { Value = ??? });
Что касается вашей второй ошибки, то для параметра требуется число. Строка
"ImageID"
это не число.
Редактировать: Вам нужно передать идентификатор записи для удаления.
Вы также должны упаковывать свои команды в
using
блоки, чтобы убедиться, что их ресурсы должным образом освобождены, когда вы закончите с ними.
Кроме того, было бы лучше создать
SqlConnection
когда это будет необходимо, и заверните его в
using
блокируйте, а не храните его в поле вашего класса. Тогда вы можете завернуть это в
using
и блок тоже.
private SqlConnection CreateConnection()
{
return new SqlConnection(...);
}
public void deletephoto(int id)
{
using (SqlConnection connection = CreateConnection())
using (SqlCommand cmd = new SqlCommand("DELETE FROM WebcamPhoto WHERE ImageID = @id", connection))
{
cmd.Parameters.Add(new SqlParameter("@id", System.Data.SqlDbType.Int) { Value = id });
connection.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("data deleted");
}
}
использование инструкции - Справочник по C# | Microsoft Docs[
^]
dyooshi
ImageID-это идентификатор автоматического приращения. Так что я не знаю, какой номер мне поставить
Richard Deeming
Вы вводите идентификатор записи, которую хотите удалить.
phil.o
Функция автоматического приращения выполняется только на INSERT
заявления. Для DELETE
операторы, вам лучше указать, какой идентификатор удалить (или вы в конечном итоге удалите все строки).
dyooshi
хорошо, но идентификатор не фиксирован, поэтому я не могу предоставить какой-либо конкретный идентификатор удаления
Richard Deeming
Так что же вы хотите удалить ВСЕ записи?
Если нет, то вы должны знать идентификатор записи, которую хотите удалить.
Компьютеры-это не магия. Вы не можете просто сказать компьютеру удалить одну запись, и он каким-то образом узнает, какую запись вы имели в виду.
dyooshi
- Нет, не знаю. На самом деле я хочу удалить строку из datagridview, которая имеет два столбца, которые являются ImageID и ImageData. Где, когда я нажимаю на строку в datagridview и нажимаю кнопку Удалить, она будет удалена. так вот почему я сказал, что не могу предоставить конкретный идентификатор
Richard Deeming
Так вы делать знайте идентификатор записи, которую вы хотите удалить - это значение, связанное с выбранной строкой в вашей сетке.
Вам просто нужно передать этот идентификатор в метод, который удаляет запись:
public void deletephoto(int id)
а затем установите это в качестве значения параметра:
cmd.Parameters.Add(new SqlParameter("@id", System.Data.SqlDbType.Int) { Value = id });
dyooshi
ну ладно, извини за это. Я пробовал это раньше, но это дает мне ошибку здесь:
Ящик для сообщений.Show("Login Success", "USBlocker", MessageBoxButtons.Хорошо, MessageBoxIcon.Информация);
deletephoto(); -------> здесь
так вот почему я так застрял. Я больше не знаю, что делать.
Richard Deeming
Вам нужно передать идентификатор записи, которую вы хотите удалить, на ваш компьютер. deletephoto
метод.
Точно так же, как вы не можете выполнить запрос, требующий параметра, не предоставив значения для этого параметра, вы не можете вызвать метод, который ожидает параметр, не предоставив значения для этого параметра.
dyooshi
извините, что задаю слишком много вопросов, но я не знаю, что делать, потому что datagridview и кнопка удаления находятся в одном интерфейсе, в то время как код кнопки удаления для удаления изображения находится в другом интерфейсе, потому что пользователь должен сначала войти в систему, чтобы удалить изображение. в случае успеха изображение будет удалено. вот почему я вызываю метод после входа в систему, это успех, и теперь я знаю, что это неправильно. Есть ли другой способ сделать это?
dyooshi
извините, что задаю слишком много вопросов, но я не знаю, что делать, потому что datagridview и кнопка удаления находятся в одном интерфейсе, в то время как код кнопки удаления для удаления изображения находится в другом интерфейсе, потому что пользователь должен сначала войти в систему, чтобы удалить изображение. в случае успеха изображение будет удалено. вот почему я вызываю метод после того, как вход в систему успешен, и теперь я знаю, что это неправильно. Есть ли другой способ сделать это?
dyooshi
Я понимаю, что вы пытаетесь объяснить. Спасибо за то, что хорошо объяснили мне, и спасибо также за то, что дали мне эти ссылки, потому что передача чего-то между двумя формами для меня нова. Я постараюсь понять и применить это в своем коде
RmcbainTheThird
Когда вы писали запрос, чтобы получить данные для заполнения вашего datagridview, содержал ли он столбец, содержащий значение автоматического приращения?
dyooshi
ты это серьезно?
общественного недействительными dgvdata()
{
SqlCommand cmd = new SqlCommand("SELECT * FROM WebcamPhoto", connection);
SqlDataAdapter da = новый SqlDataAdapter(cmd);
DataTable dt = новый DataTable();
да.Заполнить(ДТ);
dataGridView3.RowTemplate.Высота = 55 см;
dataGridView3.AllowUserToAddRows = false;
dataGridView3.Источник данных = ДТ;
dataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Заполнить;
}
RmcbainTheThird
хорошо, вам нужно найти столбец в datagrid, который имеет поле auto increment, получить это значение и передать его методу, который выполняет удаление