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

У меня проблема с моим кодом:

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
    list.Items.Clear()

    cmd.CommandText = "SELECT * FROM borrow where (Department LIKE '%" & TextBox2.Text & "%')"
    cmd.Connection = con
    cmd.CommandType = CommandType.Text
    con.Open()


    rd = cmd.ExecuteReader()
    If rd.HasRows = True Then
        While rd.Read()

            Dim listview As New ListViewItem

            listview.Text = rd("ID").ToString
            listview.SubItems.Add(rd("Department").ToString)
            listview.SubItems.Add(rd("Purpose").ToString)
            listview.SubItems.Add(rd("Items_Details").ToString)
            listview.SubItems.Add(rd("Requested_by").ToString)
            listview.SubItems.Add(rd("Approved_by").ToString)
            listview.SubItems.Add(rd("Date").ToString)
            listview.SubItems.Add(rd("Status").ToString)
            listview.SubItems.Add(rd("Date_Returned").ToString)

            list.Items.Add(listview)

        End While
    End If
    con.Close()

Как только я набрал строку в текстовом поле для поиска элемента, я получаю эту ошибку:

Параметризованный запрос '(@ Parameter1 nvarchar (4000)) SELECT * FROM loan где (Departme' ожидает параметр '@ Parameter1', который не был предоставлен.

Может кто-нибудь мне помочь?

Ответы на вопрос(6)

Ваш сайт подвергается серьезной опасности взлома.

Следить за публикациямиSQL-инъекция а такжекак это предотвратить в .NET

Ваша проблема с запросами - наименьшая из ваших проблем сейчас.

Но.....

Решение @ Misnomer близко, но не совсем там:

Измените ваш запрос на это:

cmd.CommandText = "SELECT * FROM borrow where (Department LIKE '%@DepartmentText%')"

и добавьте параметры таким образом (или так, как это делает @Misnomer):

cmd.Parameters.AddWithValue("@DepartmentText",TextBox2.Text)

Важным отличием является то, что вам нужно изменить свой CommandText.

 Abe Miessler05 окт. 2010 г., 20:53
Я подозреваю, что ваша ошибка была выброшена откуда-то еще. Можете ли вы опубликовать свой след стека?
 binki19 дек. 2018 г., 22:49
Ваш ответ не соответствует цели'%' + @DepartmentText + '%'.
 demic0de05 окт. 2010 г., 20:18
привет, я tnx .. я изменил свой код, но все еще я получаю ошибку .. cmd.CommandText = "SELECT * FROM заимствовать где (Department LIKE '% @ DepartmentText%')" cmd.Parameters.Add ("@ Department" , SqlDbType.VarChar) cmd.Parameters.AddWithValue ("@ DepartmentText", TextBox2.Text) ошибка "Параметризованный запрос" (@ Parameter1 nvarchar (4000), @ Department varchar (8000), @ Departmen 'ожидает параметр' @ Parameter1 ', который не был поставлен. "
 Abe Miessler05 окт. 2010 г., 20:53
Также вы можете обновить свой вопрос с помощью обновленного кода?

Попробуйте добавитьпараметры как это -

cmd.Parameters.Add("@Department", SqlDbType.VarChar)
cmd.Parameters("@Department").Value = TextBox2.Text

и измените текст вашей команды на то, что @Abe Miessler делает, он прав, я просто думал, что вы поймете это.

 Vishal05 окт. 2010 г., 20:41
Я не знаю почему .... но у меня такое ощущение, что у вас есть проблема с типом данных здесь ... или что-то ... видяDepartmen я чувствую, что у вас недостаточно персонажей или что-то еще ...
 Roman Pokrovskij08 сент. 2015 г., 19:12
Интересно, что такая форма не помогает: cmd.Add (new SqlParameter ("@ Department", SqlDbType.VarChar) {Value = textBox.Department, IsNullable = true});
 demic0de05 окт. 2010 г., 20:25
почему я получаю переменную DepartmentText уже объявлен? ..
 demic0de05 окт. 2010 г., 20:52
привет, я tnx .. я изменил свой код, но все еще я получаю сообщение об ошибке .. cmd.CommandText = "SELECT * FROM заимствовать где (Department LIKE '% @ DepartmentText%')" cmd.Parameters.Add ("@ DepartmentText" , SqlDbType.VarChar) cmd.Parameters.AddWithValue ("@ DepartmentText", TextBox2.Text) ошибка "Параметризованный запрос" (@ Parameter1 nvarchar (4000), @ Department varchar (8000), @ Departmen 'ожидает параметр' @ Parameter1 ', который не был поставлен.
 Thomas Kjørnes06 дек. 2011 г., 11:10
Проблема в этом случае, скорее всего, в том, что значение параметра должно включать «%%», а не заключать параметр в кавычки.
Решение Вопроса

Если вы передадите нулевое значение параметру, вы получите эту ошибку даже после добавления параметра, поэтому попробуйте проверить значение, а если оно пустое, используйте DBNull.Value.

Это будет работать

cmd.Parameters.Add("@Department", SqlDbType.VarChar)

If (TextBox2.Text = Nothing) Then
    cmd.Parameters("@Department").Value = DBNull.Value
Else
    cmd.Parameters("@Department").Value = TextBox2.Text
End If

Это преобразует нулевые значения из слоя объекта в значения DBNull, приемлемые для базы данных.

 Niels Brinch18 мая 2012 г., 11:02
Сокращение: cmd.Parameters ("@ Department"). Значение = (объект) TextBox2.Text ?? DBNull.Value;
 Joshua Oglesbee14 сент. 2017 г., 22:52
Это работает для меня. .Add был амортизирован. cmd.Parameters.AddWithValue ("@ Department", (объект) TextBox2.Text ?? DBNull.Value);
 epalm18 июл. 2019 г., 18:49
Отдокументы: "Использовать DBNull.Value вместо нуля, чтобы указать нулевое значение."
 Dan Friedman30 апр. 2018 г., 23:10
.Add(String, Object) являетсяосуждается, Add(String, SqlDbType) не является. Этот ответ (или последующие комментарии) не используют устаревший метод.

Опираясь на и упрощая ravidev'sответ:

Сокращение VB.NET

cmd.Parameters.AddWithValue("@Department", IF(TextBox2.Text, DBNull.Value))

Сокращение C # является

cmd.Parameters.AddWithValue("@Department", TextBox2.Text ?? DBNull.Value)

Если вы выполняете запись из элемента управления DataGridView в базу данных, убедитесь, что в нем нет пустой строки. Установите «Разрешить пользователю добавлять строки» в false; он обрезает ненужную последнюю пустую строку.

SqlConnection conn = new SqlConnection(connectionString);

conn.Open();
//SelectCustomerById(int x);
comboBoxEx1.Items.Clear();

SqlCommand comm = new SqlCommand("spSelectCustomerByID", conn);
//comm.Parameters.Add(new SqlParameter("cust_name", cust_name));
//comm.CommandText = "spSelectCustomerByID";
comm.Parameters.Add(new SqlParameter("cust_id", SqlDbType.Int));
comm.CommandType = CommandType.StoredProcedure;
comm.ExecuteNonQuery();

SqlDataAdapter sdap = new SqlDataAdapter(comm);
DataSet dset = new DataSet();
sdap.Fill(dset, "cust_registrations");

if (dset.Tables["cust_registrations"].Rows.Count > 0)
{
    comboBoxEx1.Items.Add("cust_registrations").ToString();
}
comboBoxEx1.DataSource = dset;
comboBoxEx1.DisplayMember = "cust_name";
 Jeff Bridgman14 мая 2015 г., 00:37
Нет объяснения? Это не хороший ответ.

Ваш ответ на вопрос