2010-10-05 9 views
46

Mam problem z moim kodu:Zapytanie parametryzowane oczekuje parametr, który nie został dostarczony

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() 

Raz wpisany w ciągu w polu tekstowym, aby szukać pozycji otrzymuję ten błąd:

The parameterized query '(@Parameter1 nvarchar(4000))SELECT * FROM borrow where (Departme' expects the parameter '@Parameter1', which was not supplied.

Czy ktoś może mi pomóc?

Odpowiedz

103

Jeśli zdasz zerową wartość parametru, otrzymasz ten błąd nawet po dodaniu parametr więc spróbuj sprawdzić wartość i jeśli jest zerowa następnie użyć DBNull.Value

To zadziała

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 

Spowoduje to przekonwertowanie wartości pustych z warstwy obiektu na wartości DBNull, które są akceptowane przez bazę danych.

+17

Skrócona instrukcja: cmd.Parameters ("@ Department") Wartość = (obiekt) TextBox2.Text ?? DBNull.Value; –

+0

To działa dla mnie .Add został amortyzowany.cmd.Parameters.AddWithValue ("@ Department", (object) TextBox2.Text ?? DBNull.Value); –

1

spróbuj dodać parameters takiego -

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

i zmienić swój tekst poleceń do co @Abe Miessler robi ma rację Pomyślałem będzie zrozumieć.

+0

Dlaczego otrzymuję zmienną DepartmentText już zadeklarowane? .. – demic0de

+0

nie wiem dlaczego .... ale mam wrażenie, że masz problem datatype tutaj ... albo coś ... widząc 'Departmen "Czuję, że nie masz wystarczającej liczby znaków lub coś takiego ... – Vishal

+0

cześć, mam tnx .. ive zmieniłem kod, ale nadal im błąd. cmd.CommandText =" WYBIERZ * Z POŻYCZKI gdzie (Departament LIKE '% @ DepartmentText% ') "cmd.Parameters.Add (" @ DepartmentText ", SqlDbType.VarChar) cmd.Parameters.AddWithValue (" @ DepartmentText ", TextBox2.Text) error" Sparametryzowane zapytanie "(@ Parameter1 nvarchar (4000), @ Dział varchar (8000), @ Departmen 'oczekuje parametru "@ Parameter1", który nie został dostarczony – demic0de

14

Twoja witryna jest poważnie zagrożona zhackowaniem.

Przeczytaj na SQL Injection i how to prevent it in .NET

Twój problem zapytanie jest najmniejszym z twoich obaw teraz.

Ale .....

@ rozwiązanie mylące jest blisko, ale nie całkiem tam:

zmienić zapytanie to:

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

i dodać parametry w ten sposób (lub drogę @Misnomer):

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

Ważną różnicą jest to, że musisz zmienić twój tekst polecenia.

+0

Witam mam tnx .. ive zmieniony kod, ale nadal im błąd .. cmd.CommandText = "SELECT * FROM borrow where (Departament LIKE"% @ DepartText% ")" cmd.Parameters.Add ("@ Department", SqlDbType.VarChar) cmd.Parameters.AddWithValue ("@ DepartmentText", TextBox2.Text) error "Sparametryzowana kwerenda" (@ Parameter1 nvarchar (4000), @ Dział varchar (8000), @ Departmen 'oczekuje parametru "@ Parameter1", który nie został dostarczony. " – demic0de

+0

Podejrzewam, że Twój błąd jest wysyłany z innego miejsca Czy możesz opublikować swój ślad stosu? –

+0

Możesz również zaktualizować swoje pytanie za pomocą zaktualizowanego kodu? –

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

Brak wyjaśnienia? To nie jest dobra odpowiedź. –

Powiązane problemy