使用MS Access数据库的update语句中的语法错误

时间:2017-04-29 06:01:02

标签: sql vb.net ms-access

我已使用utf8mb4和参数成功插入我的记录,但如果我更新记录,则会收到以下错误:

  

语法错误!

我试过把方括号放在字段名称周围,但它仍然不起作用。但是,如果我使用Access查询复制命令以进行更新,则可以正常工作。

代码:

OleDbCommand

2 个答案:

答案 0 :(得分:2)

首先,您很高兴看到您已经在使用参数,但使用MS Access,参数的顺序很重要,而不是名称。我在使用参数时在SQL命令中使用?占位符。我还指定了数据类型,因此请考虑使用OleDbParameter Constructor (String, OleDbType)添加参数。

我还会考虑实施Using

  

托管资源由.NET Framework垃圾收集器(GC)处理,无需您进行任何额外编码。对于托管资源,您不需要使用“使用”块。但是,您仍然可以使用“使用”块来强制处理受管资源,而不是等待垃圾回收器。

您可以检查ExecuteNonQuery()返回的值,以查看有多少行受影响。

最后,在VB.NET中没有在此指定修饰符; Private Sub AssignParams(cmd As OleDbCommand),编译器默认使用ByVal

  

指定以这样的方式传递参数:被调用的过程或属性不能更改调用代码中参数的变量值。

您应该使用ByRef

  

指定以这样的方式传递参数:被调用的过程可以更改调用代码中参数的变量值。

您的代码看起来像这样:

Public Function update() As Boolean

    Dim STATE As Boolean = False

    Using con As OleDbConnection = cn,
          cmd As New OleDbCommand("UPDATE [GUEST_DATA_TBL] SET [USD]=?, [RIEL]=?, [EURO]=?, [BAHT]=?, [AUSD]=?, [GIFT]=?, [MEMO]=? WHERE [ID]=?", con)

        con.Open()

        AssignParams(cmd)

        Dim rowsAffected As Integer = cmd.ExecuteNonQuery()

        If rowsAffected > 0 Then
            STATE = True
        End If

    End Using

    Return STATE

End Function

Private Sub AssignParams(ByRef cmd As OleDbCommand)
    cmd.Parameters.Add("@USD", OleDbType.[Type]).Value = USD
    cmd.Parameters.Add("@RIEL", OleDbType.[Type]).Value = RIEL
    cmd.Parameters.Add("@EURO", OleDbType.[Type]).Value =  EURO
    cmd.Parameters.Add("@BAHT", OleDbType.[Type]).Value =  BAHT
    cmd.Parameters.Add("@AUSD", OleDbType.[Type]).Value =  AUSD
    cmd.Parameters.Add("@GIFT", OleDbType.[Type]).Value = GIFT
    cmd.Parameters.Add("@MEMO", OleDbType.[Type]).Value = MEMO
    cmd.Parameters.Add("@ID", OleDbType.[Type]).Value = ID
End Sub
  

请注意,我使用了OleDbType.[Type]。您需要将[Type]替换为您在数据库中使用的数据类型。

答案 1 :(得分:0)

Private Sub AssignParams(cmd As OleDbCommand)
   cmd.Parameters.AddWithValue("@USD", USD)
   cmd.Parameters.AddWithValue("@RIEL", RIEL)
   cmd.Parameters.AddWithValue("@EURO", EURO)
   cmd.Parameters.AddWithValue("@BAHT", BAHT)       
   cmd.Parameters.AddWithValue("@AUSD", AUSD)
   cmd.Parameters.AddWithValue("@GIFT", GIFT)
   cmd.Parameters.AddWithValue("@MEMO", MEMO)
   cmd.Parameters.AddWithValue("@ID", ID)
End Sub