[英]VBA/SQL giving 'No value given for one or more required parameters.'
[英]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.