SQL UPDATE语句中的语法错误,但一切似乎都好:(

时间:2014-04-11 22:09:20

标签: mysql sql vb.net

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

(System.Data.dll中发生类型System.Data.OleDb.OleDbException的例外但未在用户代码中处理

其他信息: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

2 个答案:

答案 0 :(得分:2)

SIZE是MS-Access中的保留字,你需要在它周围加上方括号

[SIZE]=......

但我真的建议使用参数化查询来保护自己免受SQL注入和解析问题(如果一个或多个输入字符串包含单引号会怎么样?)

 cmd = New OleDbCommand("UPDATE Stocks Set Item=?, [Size]=?, Quantity=?, " & _
           "Price=?, ImageSource=? WHERE StockID=?", cn)
 cmd.Parameters.AddWithValue("@p1", item)
 cmd.Parameters.AddWithValue("@p2", siz)
 cmd.Parameters.AddWithValue("@p3", quantit )
 cmd.Parameters.AddWithValue("@p4", pric)
 cmd.Parameters.AddWithValue("@p5", sourc)
 cmd.Parameters.AddWithValue("@p6", updatestockstrings)

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

答案 1 :(得分:1)

@Steve's answer的附加信息中,在您的帖子上

您必须对INSERTUPDATEDELETE等语句使用ExecuteNonQuery。它返回受影响但不是ResultSet的记录数,以便从中读取记录。

ExecuteReader用于SELECT语句,它返回一组要读取的记录。

更改

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

cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

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