在我的程序中,我有一个名为runSQL的函数,这里是:
Dim Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TrainingLog.accdb")
Dim DT As New DataTable
Dim DataAdapter As OleDb.OleDbDataAdapter
Connection.Open()
DataAdapter = New OleDb.OleDbDataAdapter(query, Connection)
DT.Clear()
DataAdapter.Fill(DT)
Connection.Close()
Return DT
我尝试使用来自此代码的更新字符串更新数据库中的记录:
Dim sqlString As String
sqlString = "UPDATE UserRecords set FirstName = '" & txtName.Text
sqlString = sqlString & "', LastName = '" & txtSurname.Text
If ChkSmoker.Checked = True Then
sqlString = sqlString & "', Smoker = true"
ElseIf ChkSmoker.Checked = False Then
sqlString = sqlString & "', Smoker = false"
End If
sqlString = sqlString & ", Weight = " & txtWeight.Text
If RdoMale.Checked = True Then
sqlString = sqlString & ", Gender = 'm'"
ElseIf RdoFemale.Checked = True Then
sqlString = sqlString & ", Gender = 'f'"
End If
sqlString = sqlString & " WHERE UserName = '" & LstUsers.SelectedItem.ToString & "'"
runSQL(sqlString)
但是,一旦我点击了保存按钮,我就会从runSQL函数的第7行得到一个错误(不包括空行,这就是DataAdapter.Fill(DT)行),它说“"否给出一个或多个必需参数的值。"
我想知道是否有人知道这是为什么或如何解决它。
我想到的一件事是,在更新的表中,除了我的UPDATE语句中提到的字段之外还有其他字段。例如,有一个名为" TeamMember"的是/否字段,我在更新声明中没有提及。 使用更新功能时,是否必须为每个字段赋予值,即使那些字段没有被更改?
感谢阅读,希望能帮到你!
答案 0 :(得分:0)
你不应该自己编写SQL查询。为了创建参数化查询或使用存储过程,它更容易和更安全(用于注入SQL注入)。然后通过设置查询或存储过程名称和参数值来执行它。
此外,通过这种方式,您无需为特定值处理正确的格式。例如,如何格式化日期?而且,如何格式化布尔值?您查询的问题很可能是您尝试为false
列设置的true
或Smoker
值,因为在TSQL中这是一个有点值,并且只能是{ {1}}或0
。
选中此项以查看使用参数的示例:ADO.NET Code Examples(单击VB选项卡以在VB中查看)。您将看到在查询中定义了一个指定带有1
前缀的名称的参数,然后您只需为查询中的每个参数传递一个值,它将以正确的格式传递给服务器没有你照顾它。
取自其中一个样本:
@
请注意,您可以通过不同方式执行命令,具体取决于您只需执行命令或获取标量值或完整数据集。