我已使用utf8mb4
和参数成功插入我的记录,但如果我更新记录,则会收到以下错误:
语法错误!
我试过把方括号放在字段名称周围,但它仍然不起作用。但是,如果我使用Access查询复制命令以进行更新,则可以正常工作。
代码:
OleDbCommand
答案 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