web-dev-qa-db-fra.com

La requête paramétrée attend le paramètre qui n'a pas été fourni

J'ai un problème avec mon code:

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

Une fois que j'ai saisi la chaîne dans la zone de texte pour rechercher un élément, j'obtiens cette erreur: 

La requête paramétrée '(@ Parameter1 nvarchar (4000)) SELECT * FROM emprunter où (Departme 'attend le paramètre' @ Parameter1 ', qui était non fourni.

Quelqu'un peut-il m'aider?

47
demic0de

Si vous transmettez une valeur NULL au paramètre, vous obtiendrez cette erreur même après avoir ajouté le paramètreSo essayez de vérifier la valeur. Si elle est nulle, utilisez DBNull.Value. 

Ça va marcher

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

Cela convertira les valeurs nulles de la couche objet en valeurs DBNull acceptables pour la base de données.

122
ravidev

Votre site Web court le risque d'être piraté.

Lire sur Injection SQL et comment l’empêcher dans .NET

Votre problème de requête est le moindre de vos problèmes pour le moment.

Mais.....

La solution de @ Misnomer est proche mais pas tout à fait là:

Changez votre requête en ceci:

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

et ajoutez des paramètres de cette manière (ou à la manière dont @Misnomer le fait):

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

La différence importante est que vous devez modifier votre CommandText.

16
Abe Miessler

Construire et simplifier les réponses de ravidev répondre :

Le raccourci VB.NET est 

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

Le raccourci C # est 

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

1
Dan Friedman

Essayez d'ajouter paramètres comme ceci -

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

et changez le texte de votre commande en ce que @Abe Miessler a raison, je pensais juste que vous allez le comprendre.

1
Vishal

Si vous écrivez d'un contrôle DataGridView dans votre base de données, assurez-vous qu'il n'y a pas de ligne vide. Définissez 'Autoriser l'utilisateur à ajouter des lignes' sur false; il tronque la dernière ligne vide inutile. 

0
Ismaila Jonathan