2014-04-11 51 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) , 更多細節。 –