web-dev-qa-db-ja.com

パラメーター化されたクエリは、指定されていないパラメーターを予期しています

私のコードに問題があります:

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 * FROMborrow where(Departme'はパラメーター '@ Parameter1'が必要ですが、指定されていません。

誰も私を助けることができますか?

53
demic0de

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

これにより、オブジェクトレイヤーのNULL値が、データベースで受け入れ可能なDBNull値に変換されます。

135
ravidev

あなたのウェブサイトはハッキングされる深刻な危険にさらされています。

SQLインジェクション および 。NETでそれを防ぐ方法

クエリの問題は、現時点で最も懸念事項ではありません。

しかし.....

@Misnomerの解決策は近いですが、そこにはありません:

クエリをこれに変更します。

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

この方法(または@Misnomerが行う方法)でパラメーターを追加します。

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

重要な違いは、CommandTextを変更する必要があることです。

16
Abe Miessler

Ravidevの構築と簡素化 answer

VB.NETの略記は

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

C#の短縮形は

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

1
Dan Friedman

parameters を追加してみてください-

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

そして、コマンドテキストを@Abe Miesslerが正しいとするテキストに変更します。

1
Vishal

DataGridViewコントロールからデータベースに書き込む場合は、空の行がないことを確認してください。 「ユーザーによる行の追加を許可」をfalseに設定します。不要な最後の空の行を切り捨てます。

0