Mysql SQL UPDATE语句中出现语法错误,但看起来一切正常:(

Mysql SQL UPDATE语句中出现语法错误,但看起来一切正常:(,mysql,sql,vb.net,Mysql,Sql,Vb.net,我在数据库中的一个表中遇到此错误: (System.Data.dll中出现类型为System.Data.OleDb.OLEDBEException的异常,但未在用户代码中处理。) 其他信息:UPDATE语句中的语法错误。) 它允许我从中读取数据,但当我添加新记录或使用SQL查询更新它时,它会给我这个错误,我已经检查过、重复检查过、重复检查过,但看不出有任何错误……奇怪的是,我从另一个表中获取了它,我知道它正在工作,并确保我更改了所有变量,但没有任何效果 抱歉,如果你们都认为这是一个非常肮脏的代码

我在数据库中的一个表中遇到此错误:

(System.Data.dll中出现类型为
System.Data.OleDb.OLEDBEException
的异常,但未在用户代码中处理。)

其他信息:UPDATE语句中的语法错误。)

它允许我从中读取数据,但当我添加新记录或使用SQL查询更新它时,它会给我这个错误,我已经检查过、重复检查过、重复检查过,但看不出有任何错误……奇怪的是,我从另一个表中获取了它,我知道它正在工作,并确保我更改了所有变量,但没有任何效果

抱歉,如果你们都认为这是一个非常肮脏的代码,这是我第一年的项目,我仍然在寻找更快的方法来做事情

如果有人能看一看,看看他们是否能弄明白,那将不胜感激

Sub Update()

    Dim cs As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("mydatabasename") + ";"
    Dim cn As New OleDbConnection(cs)
    Dim cmd As OleDbCommand
    Dim r As OleDbDataReader
    Dim ite As String
    Dim siz As String
    Dim quantit As String
    Dim pric As String
    Dim sourc As String
    Dim updatestockstrings As String
    updatestockstrings = Request.QueryString("updatestock")
    ite = itm.Value
    siz = sze.Value
    quantit = qty.Value
    pric = prc.Value
    sourc = imgsrc.Value
    If ite = "" Then
        parMsg.InnerHtml = "Please add an item name"
    ElseIf siz = "" Then
        parMsg.InnerHtml = "Please add a size"
    ElseIf quantit = "" Then
        parMsg.InnerHtml = "Please add a quantity"
    ElseIf pric = "" Then
        parMsg.InnerHtml = "Please state a price"
    ElseIf sourc = "" Then
        parMsg.InnerHtml = "Please add an image source"
    Else
        cmd = New OleDbCommand("UPDATE Stocks Set Item='" & ite & "', Size='" & siz & "', Quantity='" & quantit & "', Price='" & pric & "', ImageSource='" & sourc & "' WHERE StockID=" & updatestockstrings & ";", cn)
        cn.Open()
        r = cmd.ExecuteReader()
        Do While r.Read()
        Loop
        cn.Close()
        parMsg.InnerHtml = "Update Successful!"
    End If
End Sub

SIZE是MS Access中的保留字,您需要在其周围放置方括号

[SIZE]=......
但我确实建议使用参数化查询来防止SQL注入和解析问题(如果一个或多个输入字符串包含一个引号会发生什么情况?)


但这仍然不够。您应该为基础数据库字段传递具有正确数据类型的参数。因此,例如,如果数据库字段
Price
是十进制列,则需要将
pric
变量转换为十进制值(这要求您对其进行分析,以确保收到了有效的十进制值)

大小是MS Access中的保留字,需要在其周围放上方括号

[SIZE]=......
但我确实建议使用参数化查询来防止SQL注入和解析问题(如果一个或多个输入字符串包含一个引号会发生什么情况?)


但这仍然不够。您应该为基础数据库字段传递具有正确数据类型的参数。因此,例如,如果数据库字段
Price
是十进制列,则需要将
pric
变量转换为十进制值(这要求您对其进行分析,以确保收到了有效的十进制值)

大小是MS Access中的保留字,需要在其周围放上方括号

[SIZE]=......
但我确实建议使用参数化查询来防止SQL注入和解析问题(如果一个或多个输入字符串包含一个引号会发生什么情况?)


但这仍然不够。您应该为基础数据库字段传递具有正确数据类型的参数。因此,例如,如果数据库字段
Price
是十进制列,则需要将
pric
变量转换为十进制值(这要求您对其进行分析,以确保收到了有效的十进制值)

大小是MS Access中的保留字,需要在其周围放上方括号

[SIZE]=......
但我确实建议使用参数化查询来防止SQL注入和解析问题(如果一个或多个输入字符串包含一个引号会发生什么情况?)

但这仍然不够。您应该为基础数据库字段传递具有正确数据类型的参数。因此,例如,如果数据库字段
Price
是十进制列,则需要将
pric
变量转换为十进制值(这要求您对其进行分析,以确保您收到了有效的十进制值)

在扩展到中,在发布时

您必须在诸如
INSERT
UPDATE
DELETE
之类的语句上使用。它返回受影响的记录数,但不返回要从中读取记录的
ResultSet

用于返回一组要读取的记录的
SELECT
语句

更改

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
除非需要,否则将执行查询的结果捕获为整数是可选的。

在您的发布中,作为扩展

您必须在诸如
INSERT
UPDATE
DELETE
之类的语句上使用。它返回受影响的记录数,但不返回要从中读取记录的
ResultSet

用于返回一组要读取的记录的
SELECT
语句

更改

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
除非需要,否则将执行查询的结果捕获为整数是可选的。

在您的发布中,作为扩展

您必须在诸如
INSERT
UPDATE
DELETE
之类的语句上使用。它返回受影响的记录数,但不返回要从中读取记录的
ResultSet

用于返回一组要读取的记录的
SELECT
语句

更改

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
除非需要,否则将执行查询的结果捕获为整数是可选的。

在您的发布中,作为扩展

您必须在诸如
INSERT
UPDATE
DELETE
之类的语句上使用。它返回受影响的记录数,但不返回要从中读取记录的
ResultSet

用于返回一组要读取的记录的
SELECT
语句

更改

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

除非需要,否则将
ExecuteNonQuery的结果捕获为整数是可选的。

可能是一个断章取义的问题,即为什么上面的每个变量都缺少最后一个字母?首先,停止连接SQL语句。搜索SQL注入,然后在此处搜索“vb.net参数化查询”。若要解决当前问题,请将SQL存储在字符串中(而不是直接放在OleDBCommand中),并添加一个messagebox,显示已完成的SQL语句。如果