我在数据库中的一个表中收到此错误:
(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
答案 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的附加信息中,在您的帖子上
您必须对INSERT
,UPDATE
和DELETE
等语句使用ExecuteNonQuery
。它返回受影响但不是ResultSet
的记录数,以便从中读取记录。
ExecuteReader
用于SELECT
语句,它返回一组要读取的记录。
更改:
cn.Open()
r = cmd.ExecuteReader()
Do While r.Read()
Loop
cn.Close()
致:
cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
除非必要,否则将ExecuteNonQuery
的结果捕获为整数是可选的。