2

在我的程序中,我有一个名为 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”的是/否字段,我在更新声明中没有提及。使用更新功能时,我是否必须为每个字段提供值,即使是那些没有被更改的字段?

感谢阅读,希望对您有所帮助!

4

1 回答 1

0

您永远不应该自己编写 SQL 查询。创建参数化查询或使用存储过程更容易和更安全(避免 SQL 注入)。然后通过传递查询或存储过程名称和参数值来执行它。

此外,通过这种方式,您不必关心特定值的正确格式是什么。例如,如何格式化日期?而且,如何格式化布尔值?您的查询的问题很可能是您尝试为该列设置的falseor值,因为在 TSQL 中这是一个位值,并且只能是or 。trueSmoker01

选中此项以查看使用参数的示例:ADO.NET 代码示例(单击 VB 选项卡以在 VB 中查看)。您将看到您在查询中定义了一个参数,指定了一个带有@前缀的名称,然后您只需为查询中的每个参数传递一个值,它将以正确的格式传递给服务器,而无需您照顾它。

取自其中一个样本:

Dim queryString As String = _
        "SELECT ProductID, UnitPrice, ProductName from dbo.Products " _
        & "WHERE UnitPrice > @pricePoint " _
        & "ORDER BY UnitPrice DESC;"
Dim command As New SqlCommand(queryString, connection)
command.Parameters.AddWithValue("@pricePoint", paramValue)

'' command.ExecuteXXX 

请注意,您可以以不同的方式执行命令,具体取决于您是否需要简单地执行它或获取标量值或完整的数据集作为结果。

于 2015-02-23T09:32:59.457 回答