dyooshi Ответов: 2

Параметризованный запрос ожидает параметр @id, который не был указан C#


Я не вижу никакой ошибки, но когда я запускаю код, он говорит, что параметризованный запрос ожидает параметр @id, который не был указан.

public void deletephoto()
        {
            connection.Open();
            
            SqlCommand cmd = new SqlCommand("DELETE FROM WebcamPhoto WHERE ImageID = @id", connection);
            cmd.Parameters.Add(new SqlParameter("@id", System.Data.SqlDbType.Int));
            cmd.ExecuteNonQuery();
            MessageBox.Show("data deleted");
            connection.Close();
        }


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

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

cmd.Parameters.Add(new SqlParameter("@id", System.Data.SqlDbType.Int,"ImageID"));


но вышла новая ошибка которая такова не удается преобразовать из string в int. Заранее благодарю вас

2 Ответов

Рейтинг:
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 и кнопка удаления находятся в одном интерфейсе, в то время как код кнопки удаления для удаления изображения находится в другом интерфейсе, потому что пользователь должен сначала войти в систему, чтобы удалить изображение. в случае успеха изображение будет удалено. вот почему я вызываю метод после того, как вход в систему успешен, и теперь я знаю, что это неправильно. Есть ли другой способ сделать это?

Richard Deeming

Я не знаю, как еще это объяснить.

Вы хотите удалить определенную запись. Вы ДОЛЖЕН знайте идентификатор записи, которую вы хотите удалить. Вы ДОЛЖЕН передайте это удостоверение личности в deletephoto метод.

Нет никакого волшебного решения, с помощью которого компьютер "угадывает", какую запись вы хотите удалить.

Если вы хотите получить идентификатор из другой формы, вам нужно будет найти способ передать его между формами:
Передача информации между двумя формами, Часть 1: Родитель-Ребенок[^]
Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^]
Передача информации между двумя формами, Часть 3: Ребенок ребенку[^]

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, получить это значение и передать его методу, который выполняет удаление

Рейтинг:
11

Richard MacCutchan

cmd.Parameters.Add(new SqlParameter("@id", System.Data.SqlDbType.Int));

Вы добавили параметр по имени и типу, но не указали его значения. Объект sqlparameter.Свойство Value (System.Data.SqlClient) | Microsoft Docs[^].