1

私はvb.netの初心者ですが、コードの何が問題なのか、エラーが存在しcmd.ExecuteNonQueryNo value given for one or more required parameters と表示されます。どう対処すればいいですか、助けてください。この問題を含むすべてのフォーラムを既に確認しましたが、コードの問題に適合するものはありません。助けてください。

Dim con1 As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\Users\Admin\Documents\Visual Studio 2010\Projects\AG Hostel Room Management System1\AG Hostel Room Management System1\AGHostelRooms.accdb")
    Dim str As String
    str = "UPDATE Rooms SET [Room Number] = ? , [Room Type] = ?, Price = ?" & _
          " WHERE [Room Number] = ?"
    con1.Open()
    Using cmd = New OleDbCommand(str, con1)
        cmd.Parameters.AddWithValue("@p1", TextBox2.Text)
        cmd.Parameters.AddWithValue("@p2", TextBox3.Text)
        cmd.Parameters.AddWithValue("@p3", TextBox1.Text)
        cmd.ExecuteNonQuery()
        con1.Close()
    End Using
4

1 に答える 1

2

パラメータ コレクションにパラメータがありません。4 つのパラメーター プレースホルダー (?) がありますが、コレクションに追加するパラメーターは 3 つだけです。
WHERE 句で使用される最後のものを追加する必要があります。

AddWithValueしかし、この些細なエラーの一部として、そのメソッドはパラメーター値を正しく指定しないと予期しない動作をするため、 使用する際には十分に注意する必要があります。

あなたの場合、パラメータ値として常に文字列を渡しますが、データベース フィールドがすべて文字列であるとは限りません。
このコンテキストでAddWithValueは、特定のパラメーターが数値、日時、またはブール フィールドを更新するために使用されるかどうかを知る方法がないため、値のデータ型を調べてパラメーターのデータ型を決定します。

これにより、特に日付と 10 進数の値で、DataType Mismatch 例外または誤った値が挿入される可能性がありました。これらの値は、クライアント プログラムのローカライズで文字列として表されるデータベース エンジンに送信されますが、データベースが文字列を元の列で期待される正しい型に変換するために使用するコードと互換性がない可能性があります。

このブログ記事の詳細を参照してくださいCan we stop to use AddWithValue already?

Parameters.Add受信列の正確なデータ型を指定できるメソッドの特定の実装を常に使用することをお勧めします。
もちろん、パラメータ値は正しいデータ型でなければなりません。

Dim str As String
str = "UPDATE Rooms SET [Room Type] = ?, Price = ? WHERE [Room Number] = ?"
Using con1 = New OleDbConnection("......")
Using cmd = New OleDbCommand(str, con1)
    con1.Open()
    cmd.Parameters.Add("@p1", OleDbType.VarWChar).Value = TextBox3.Text
    cmd.Parameters.Add("@p2", OleDbType.Decimal).Value = Convert.ToDecimal(textBox1.Text)
    cmd.Parameters.Add("@p3", OleDbType.Integer).Value = Convert.ToInt32(textBox2.Text)
    cmd.ExecuteNonQuery()
End Using
End Using

私の知る限り、Room Number値を WHERE 句で使用されているのと同じ値に変更する必要はないため、クエリを 3 つのパラメーターだけで動作するように変更したことに注意してください。

もちろん、OleDbType各 Add で使用する正確なものは、列の実際のデータ型と一致する必要があります。

于 2016-03-12T13:12:49.733 に答える