Подтвердить что ты не робот

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

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

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 занять там, где (Departme 'ожидает параметр' @Parameter1 ', который был не прилагается.

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

4b9b3361

Ответ 1

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

Ответ 2

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

Читайте на SQL Injection и как предотвратить это в .NET.

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

Но.....

Решение

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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";