簡體   English   中英

沒有為 1 個或多個必需參數提供值。 更新 SQL

[英]No Value given for 1 or more required parameters. Update SQL

我正在編寫一個程序,當用戶在列表視圖上選擇一條記錄時,它會更新密碼或點數。 我收到一個錯誤“沒有為 1 個或多個必需參數提供值”,我不知道如何糾正,我是否遺漏了一些明顯的東西?

Dim sql As String = "UPDATE Users SET [Password] = @2,[LoyaltyPoints] = @3 WHERE [Username] = '" & mListView.SelectedItems(0).Text & "'"
cmd = New OleDbCommand(sql, con)

'ADD PARAMETER
cmd.Parameters.AddWithValue("@1", UpdatedUser)
cmd.Parameters.AddWithValue("@2", UpdatedPass)
cmd.Parameters.AddWithValue("@3", UpdatedPoints)


'OPEN CONNECTION,EXECUTE UPDATE,CLOSE CONNECTION'
Try
    con.Open()
    adapter = New OleDbDataAdapter(cmd)
    adapter.UpdateCommand = con.CreateCommand()
    adapter.UpdateCommand.CommandText = sql

    If (adapter.UpdateCommand.ExecuteNonQuery() = 0) Then 'Error Appears Here
        MsgBox("Successfully Updated")
        ClearAll()
    Else
        MsgBox("Unsuccessful")
     End If
     con.Close()
     Retrieve()

     Catch ex As Exception
         MsgBox(ex.Message)
         con.Close()
     End Try
End Sub

其他人已經指出了這個問題(和解決方案),但我想補充一點……避免命名參數 1、2、3 或 A、B、C。我敢打賭,如果你將它們命名為與正在發送的數據相對應的方式,診斷問題會更容易。 您在查詢中缺少@1...但不要將其命名為@1:

Dim sql As String = "UPDATE Users SET [Password] = @PASS,[LoyaltyPoints] = @POINTS WHERE [Username] = @USER"
cmd = New OleDbCommand(sql, con)

cmd.Parameters.AddWithValue("@USER", UpdatedUser)
cmd.Parameters.AddWithValue("@PASS", UpdatedPass)
cmd.Parameters.AddWithValue("@POINTS", UpdatedPoints)

不要在傷口上撒鹽,但你的解決方案是倒退了一大步。 各方面參數都不錯。 它們更適合數據庫、更清晰的代碼、完全安全,並且它們處理數據奇怪的問題,例如,如果您傳遞的任何值中存在單引號字符(如果發生這種情況,您的解決方案將崩潰​​)。

代碼應該像這樣工作:

Dim updatedUser = mListView.SelectedItems(0).Text

Dim sql As String = "UPDATE Users SET [Password] = @pass, [LoyaltyPoints] = @points WHERE [Username] = @username"

Using conn As New OleDbConnection("your connection string"),
        cmd As New OleDbCommand(sql, conn)

    'TODO: Use the correct values for each .OleDbType and .Size parameter.
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@pass", .OleDbType = OleDbType.VarWChar, .Size = 99, .Value = updatedPass})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@points", .OleDbType = OleDbType.Integer, .Value = updatedPoints})
    cmd.Parameters.Add(New OleDbParameter With {.ParameterName = "@username", .OleDbType = OleDbType.VarWChar, .Size = 99, .Value = updatedUser})

    Try
        conn.Open()

        If cmd.ExecuteNonQuery() = 0 Then
            MsgBox("Unsuccessful")
            ClearAll()
        Else
            MsgBox("Successfully Updated")
        End If

        Retrieve()

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

End Using

我明白了,我不得不對 SQL 文本進行調整

        Dim sql As String = "UPDATE Users SET [Password] = '" + UpdatedPass + "',[LoyaltyPoints] = '" + UpdatedPoints + "' WHERE [Username] = '" & mListView.SelectedItems(0).Text & "'"
        cmd = New OleDbCommand(sql, con)

        'OPEN CONNECTION,EXECUTE UPDATE,CLOSE CONNECTION'
        Try
            con.Open()
            adapter = New OleDbDataAdapter(cmd)
            adapter.UpdateCommand = con.CreateCommand()
            adapter.UpdateCommand.CommandText = sql

            If (adapter.UpdateCommand.ExecuteNonQuery() > 0) Then
                MsgBox("Successfully Updated")
            Else
                MsgBox("Unsuccessful")
            End If
            con.Close()
            Retrieve()

        Catch ex As Exception
            MsgBox(ex.Message)
            con.Close()
        End Try

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM