2014-04-11 30 views
0

我收到此错误与我的数据库中的表之一:语法错误在SQL UPDATE语句,但是这一切似乎确定:(

System.Data.OleDb.OleDbException类型的异常出现在system.data.dll但没有在用户代码中处理

其他信息:语法错误在UPDATE语句)

它让我从中读出,但是当我来添加新记录或使用SQL查询更新它,它给了我这个错误。 ,我已检查,双重检查和三重检查,但看不出有什么问题......奇怪的是,我从另一张桌子上拿下来w这是我知道的工作,并确保我改变了所有的变数,但无济于事!

道歉,如果你们都认为这是非常肮脏的代码,它是我的第一年项目,我仍然让我的头更快的方式做事情!

如果有人可以看看它,看看他们是否可以弄明白,那将是非常感谢!

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 
+0

也许为什么上面的每个变量都缺少最后一个字母,这是一个背景问题? – Arman

+2

首先,**停止连接SQL语句**。搜索SQL注入,然后在SO搜索“vb.net参数化查询”。要解决当前的问题,请将SQL存储在一个字符串中(而不是直接将其放入OleDBCommand中),并添加一个显示完成的SQL语句的消息框。 –

+0

如果您发布了生成的实际SQL语句而不是构建它的代码,那么这会有所帮助。或者更好的是,在SSMS中打开该SQL语句并尝试运行它,然后您将看到问题的确切位置。 – JohnFx

回答

2

大小在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变量转换为十进制值(这需要你分析它,以确保您收到有效的十进制值)

+0

您是否必须创建一个参数文件,因为当我使用此参数时,我得到“BC30451:'参数'未声明,由于其保护级别,可能无法访问。我使用获得帮助,它说生成参数类,它创建parameters.vb这是一个空白的文件,但仍然给我同样的错误? – Figrol

+0

这很奇怪。可能是某种错误的错误,因为参数确实是OleDbCommand的属性http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx – Steve

1

在扩展@Steve's answer,在你的帖子,

你必须在语句中使用ExecuteNonQueryINSERTUPDATEDELETE。它返回受影响记录的数量,但不是ResultSet以从中读取记录。

ExecuteReader针对的是SELECT语句,它返回要读取的一组记录。

变化

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

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

除非需要,捕捉的ExecuteNonQuery结果转换成一个整数是可选的。

+0

刚注意到这一点。你当然是对的。 – Steve

+0

谢谢@Steve,这是导致问题的大小。如果我的理解正确,我不能使用'ExecureReader'进行UPDATE/INSERT等只有一个SELECT语句,但是,它的工作原理...我没有改变它,语句仍然更新。我真的不知道用户如何使用参数化查询,'@'p1,'@'p2等是用于输入数据的文本框吗?谢谢 – Figrol

+0

@Figrol:阅读[* SqlCommand.Parameters *](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters(v = vs.110).aspx) , 更多细节。 –