【问题标题】:Receiving an error when attempting to update a record尝试更新记录时收到错误
【发布时间】:2015-04-24 10:48:59
【问题描述】:

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

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

【问题讨论】:

  • 老实说我不知道​​。我只是在学校学习 Visual Basic,我被告知要使用 SQL 部分,而不是教他们。
  • 您是否真正查看过所有代码生成的 SQL 语句?这是要做的第一件事,看看它是否是你所期望的。如果您看过,请告诉我们您看到了什么。
  • UPDATE UserRecords set FirstName = 'Dave', LastName = 'Smith', Smoker = false, Weight = 55, Gender = 'm' WHERE UserName = 'Dave1'
  • runSQL 函数看起来像是用于选择行并放置在数据表中的东西。您正在运行的 sql 是更新而不是选择。该命令将仅返回受影响的行数,而不是可以插入数据表的数据行。
  • 我的老师为我们提供了帮助表 PDF,这就是他说要使用的方法,这与将用户添加到数据库时相同,我目前在物理领域不计算但我会在电脑上再次检查代码

标签: sql vb.net ms-access sqlparameter sql-parametrized-query


【解决方案1】:

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

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

选中此项以查看使用参数的示例:ADO.NET Code Examples(单击 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 

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

【讨论】:

  • 不过,当我将用户添加到数据库时,我会使用以下代码:(没关系,我认为 cmets 不允许我将其粘贴进去并很好地格式化它)但是当添加一个用户,真或假是我在访问中用于“是/否”列的内容,它适用于添加,所以我认为它适用于编辑
  • 在程序的其他地方我在这里使用了代码:pastebin.com/qPwW2zTw(不确定网站上是否允许使用 pastebin,但我认为我不能在 cmets 中正确格式化代码)并且效果很好,使用 SQL 函数,并使用 true 作为它的值。 (TeamMember 的复选框与原始问题中的吸烟者相同)所以我很确定问题出在其他地方。我只是找不到在哪里
  • 你太棒了,@DatBrummie。对不起,我没有意识到这是 Access。 Nexttiem,尝试正确标记您的问题。我已经更正了标签。
  • 对不起,我的错。这是我在这个网站上的第一篇文章,我不确定标签实际上应该是。我发现了这个问题,这是我以前应该看到的非常愚蠢的东西......结果在我试图填写一个名为“LastName”的字段的sqlstring中,但是在数据库中,该字段被称为“Surname”我觉得像这样的白痴。如何将问题标记为已关闭?
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多