it-swarm.com.de

Die parametrisierte Abfrage erwartet den Parameter, der nicht angegeben wurde

Ich habe ein Problem mit meinem 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()

Sobald ich die Zeichenfolge in das Textfeld eingegeben habe, um nach einem Artikel zu suchen, erhalte ich diese Fehlermeldung: 

Die parametrisierte Abfrage '(@ Parameter1 nvarchar (4000)) SELECT * FROM leihen wo (Departme 'erwartet den Parameter' @ Parameter1 ', der nicht angegeben wurde.

Kann mir jemand helfen?

47
demic0de

Wenn Sie dem Parameter einen NULL-Wert übergeben, wird dieser Fehler auch nach dem Hinzufügen des Parameters angezeigt 

Das wird funktionieren

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

Dadurch werden die Nullwerte aus der Objektschicht in für die Datenbank akzeptable DBNull-Werte konvertiert.

122
ravidev

Ihre Website ist in Gefahr, gehackt zu werden.

Informieren Sie sich über SQL Injection und wie Sie dies in .NET verhindern können

Ihr Anfrageproblem ist derzeit das geringste Anliegen.

Aber.....

@ Misnomers Lösung ist nahe, aber nicht ganz da:

Ändern Sie Ihre Abfrage folgendermaßen:

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

und fügen Sie Parameter auf diese Weise hinzu (oder auf die Art und Weise, wie @Misnomer dies tut):

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

Der wichtige Unterschied ist, dass Sie Ihren CommandText ändern müssen.

16
Abe Miessler

Aufbau und Vereinfachung von Ravidevs Antwort :

Die VB.NET-Abkürzung lautet 

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

Die Abkürzung für C # ist 

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

1
Dan Friedman

Versuchen Sie, Parameter hinzuzufügen so -

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

und ändern Sie Ihren Befehlstext in @Abe Miessler. Er hat Recht. Ich dachte, Sie werden es herausfinden.

1
Vishal

Wenn Sie von einem DataGridView-Steuerelement in Ihre Datenbank schreiben, müssen Sie sicherstellen, dass keine leere Zeile vorhanden ist. Setzen Sie "Erlaube dem Benutzer das Hinzufügen von Zeilen" auf "false". Die letzte leere Zeile wird abgeschnitten. 

0